@Conqueror3
Энтузиаст

C 1 или с 0 начинается индексация массива указателей аргумента командной строки?

Если быть точным, то меня волнует строчка mem_size = atoi(argv[1]);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
	char *char_ptr;  // Указатель на символьный тип
	int *int_ptr;    // Указатель на целый тип
	int mem_size;

	if (argc < 2)		// Если нет аргументов командной строки,
		mem_size = 50;  // исползуется 50 - значение по умолчанию
	else
		mem_size = atoi(argv[0]);

	printf("\t[+] allocating %d bytes of memory on the heap for char_ptr\n", mem_size);
	
	char_ptr = (char *) malloc(mem_size);  // Выделение памяти в куче

	if(char_ptr == NULL)    // Проверка ошибки сбоя функции malloc()
	{
		fprintf(stderr, "Error: could not allocate heap memory.\n");
		exit(-1);
	}

	strcpy(char_ptr, "Thes is memory is located in the heap.");
	printf("char_ptr (%p) --> '%s'\n", char_ptr, char_ptr);

	printf("\t[+] allocating 12 bytes of memory on the heap for Int_ptr\n");
	int_ptr = (int *) malloc(12);  // Еще раз выделяем память в куче

	if(int_ptr == NULL)
	{
		fprintf(stderr, "Error: could not alllocate heap memory.\n");
		exit(-1);
	}

	strcpy(char_ptr, "new memory");
	printf("char_ptr (%p) --> '%s'\n", char_ptr, char_ptr);

	printf("\t[-] freeing int_ptr's heap memory...\n");
	free(int_ptr);  // Освободить память в куче
	printf("\t[-] freeing char_ptr's heap memory..\n");
	free(char_ptr); // Освободить еще один блок памяти в куче
}


P.S. Пробовал с 1 и с 0 запускать прогу. Работает и так и так. Вот только если начинаю вводить что-нибудь после вызова программы с 0 типа ./tree.out 123 , то программа аварийно останавливается
king@king:~$ ./tree.out 0913
	[+] allocating 0 bytes of memory on the heap for char_ptr
char_ptr (0x1702420) --> 'Thes is memory is located in the heap.'
	[+] allocating 12 bytes of memory on the heap for Int_ptr
char_ptr (0x1702420) --> 'new memory'
	[-] freeing int_ptr's heap memory...
*** Error in `./tree.out': free(): invalid next size (fast): 0x0000000001702440 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7ffa970a17e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7ffa970aa37a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7ffa970ae53c]
./tree.out[0x400892]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7ffa9704a830]
./tree.out[0x400649]
======= Memory map: ========
00400000-00401000 r-xp 00000000 08:01 20578604                           /home/king/tree.out
00600000-00601000 r--p 00000000 08:01 20578604                           /home/king/tree.out
00601000-00602000 rw-p 00001000 08:01 20578604                           /home/king/tree.out
01702000-01723000 rw-p 00000000 00:00 0                                  [heap]
7ffa90000000-7ffa90021000 rw-p 00000000 00:00 0 
7ffa90021000-7ffa94000000 ---p 00000000 00:00 0 
7ffa96e14000-7ffa96e2a000 r-xp 00000000 08:01 25301471                   /lib/x86_64-linux-gnu/libgcc_s.so.1
7ffa96e2a000-7ffa97029000 ---p 00016000 08:01 25301471                   /lib/x86_64-linux-gnu/libgcc_s.so.1
7ffa97029000-7ffa9702a000 rw-p 00015000 08:01 25301471                   /lib/x86_64-linux-gnu/libgcc_s.so.1
7ffa9702a000-7ffa971ea000 r-xp 00000000 08:01 25301433                   /lib/x86_64-linux-gnu/libc-2.23.so
7ffa971ea000-7ffa973ea000 ---p 001c0000 08:01 25301433                   /lib/x86_64-linux-gnu/libc-2.23.so
7ffa973ea000-7ffa973ee000 r--p 001c0000 08:01 25301433                   /lib/x86_64-linux-gnu/libc-2.23.so
7ffa973ee000-7ffa973f0000 rw-p 001c4000 08:01 25301433                   /lib/x86_64-linux-gnu/libc-2.23.so
7ffa973f0000-7ffa973f4000 rw-p 00000000 00:00 0 
7ffa973f4000-7ffa9741a000 r-xp 00000000 08:01 25301405                   /lib/x86_64-linux-gnu/ld-2.23.so
7ffa975fa000-7ffa975fd000 rw-p 00000000 00:00 0 
7ffa97616000-7ffa97619000 rw-p 00000000 00:00 0 
7ffa97619000-7ffa9761a000 r--p 00025000 08:01 25301405                   /lib/x86_64-linux-gnu/ld-2.23.so
7ffa9761a000-7ffa9761b000 rw-p 00026000 08:01 25301405                   /lib/x86_64-linux-gnu/ld-2.23.so
7ffa9761b000-7ffa9761c000 rw-p 00000000 00:00 0 
7fff870f0000-7fff87111000 rw-p 00000000 00:00 0                          [stack]
7fff871c3000-7fff871c5000 r--p 00000000 00:00 0                          [vvar]
7fff871c5000-7fff871c7000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Аварийный останов (сделан дамп памяти)


С 1-ей программа работает только с большими числами (примерно больше 70), а с маленькими тоже дает сбой.
  • Вопрос задан
  • 290 просмотров
Решения вопроса 1
Пригласить эксперта
Ответы на вопрос 3
@awdemme
C 1 или с 0 начинается индексация массива указателей аргумента командной строки


В нулевом элементе, как правило, хранится путь к самому исполняемому файлу вашей программы.
А начиная с 1-го элемента - уже аргументы командной строки.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
https://msdn.microsoft.com/ru-ru/library/88w63h9k.aspx
А падает программа из-за того, что вы не проверяете размер выделенного буфера перед использованием функции
strcpy(char_ptr, "Thes is memory is located in the heap.");
Если выделено меньше, чем длина вашей строки +1, то остаток строки записывается в произвольное место, вызывая ошибку.
Ответ написан
Комментировать
dio4
@dio4
team leader, devops engineer, master of sports
пользуйтесь strncpy() так надежнее и еще..
"Если строка содержит корректную последовательность цифр, представляющих число 0, то также возвращается 0, при этом по возвращаемому числу невозможно определить, содержит ли строка корректное число или нет. Более новая функция strtol не имеет подобного недостатка, поэтому в тех случаях, когда это критично, следует использовать её."

заменить у вас строку
else
mem_size = atoi(argv[0]);
на else
mem_size = atoi(argv[1]);
так у меня не падает (имя программы ./atoi)
вывод

alexander@alexander-Inspiron-3521:~/tmp$ ./atoi 0123
[+] allocating 123 bytes of memory on the heap for char_ptr
char_ptr (0xbd3010) --> 'Thes is memory is located in the heap.'
[+] allocating 12 bytes of memory on the heap for Int_ptr
char_ptr (0xbd3010) --> 'new memory'
[-] freeing int_ptr's heap memory...
[-] freeing char_ptr's heap memory..
alexander@alexander-Inspiron-3521:~/tmp$

Ну и без параметров работает. Тогда память 50 по дефолту.
А падает, если память передать нулевую, те $ ./atoi 0
тогда вывод
*** Error in `./atoi': free(): invalid next size (fast): 0x0000000000973030 ***
Аварийный останов (сделан дамп памяти)
так что введите еще в код проверку передаваемых аргументов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
01 дек. 2022, в 20:31
800 руб./за проект
01 дек. 2022, в 20:24
3000 руб./за проект
01 дек. 2022, в 20:24
1500 руб./за проект