C 1 или с 0 начинается индексация массива указателей аргумента командной строки? Если быть точным, то меня волнует строчка mem_size = atoi(argv[1]);#include
#include
#include
int main(int argc, char *argv[])
{
char *char_ptr; // Указатель на символьный тип
int *int_ptr; // Указатель на целый тип
int mem_size;
if (argc '%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), а с маленькими тоже дает сбой.

21 Авг 2019 в 06:26
189 +1
0
Ответы
1

Индексация массива указателей аргумента командной строки начинается с 0. Первый элемент массива argv[0] содержит имя программы, которая была вызвана, а следующие элементы содержат аргументы командной строки.

В вашем коде вы должны использовать mem_size = atoi(argv[1]); чтобы преобразовать второй аргумент командной строки в целое число. argv[0] содержит имя исполняемого файла, поэтому при запуске программы с 0 аргументом ввода она не работает должным образом, и может вызвать ошибки, поскольку попытка преобразовать его в число вызовет ошибку.

20 Апр в 13:18
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 95 117 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир