Странное расположение в памяти аргументов функции с неизвестным количество аргументов - C (СИ)
Формулировка задачи:
Не могу понять, почему такая программа не работает, выдавая segmentation fault после распечатки первой строки:
Но если поменять сдвиг, на 3, то все начинает работать:
Я же правильно понимаю, что аргументы должны идти в памяти друг за другом? Их размер по 8 байт, т.к. 64 разрядная система и указатели, но арифметика указателей сама это учитывает. Но откуда же берется сдвиг и как его узнать нормально?
Возможно, это связанно с компьютером, на котором компилируется программа. У меня Ubuntu, x64. Компилирую обычным gcc в консоли.
Листинг программы
- void makeArr(char *str, ...)
- {
- char **p = &str;
- puts(*p);
- puts(*(p+1));
- puts(*(p+2));
- puts(*(p+3));
- }
- int main(void)
- {
- makeArr("a", "bm", "cdg", "ytttttt", NULL);
- return 0;
- }
Листинг программы
- void makeArr(char *str, ...)
- {
- char **p = &str;
- puts(*p);
- puts(*(p+4));
- puts(*(p+5));
- puts(*(p+6));
- }
- int main(void)
- {
- makeArr("a", "bm", "cdg", "ytttttt", NULL);
- return 0;
- }
Решение задачи: «Странное расположение в памяти аргументов функции с неизвестным количество аргументов»
textual
Листинг программы
- void makeArr(char *str, ...)
- {
- char* p = NULL;
- va_list ap;
- puts(str);
- va_start(ap, str);
- while(p = va_arg(ap, char*))
- puts(p);
- va_end(ap);
- }
- ...
- makeArr("a", "bm", "cdg", "ytttttt", NULL);
Объяснение кода листинга программы
В данном коде реализована функция makeArr
, которая принимает два аргумента: строку и переменное количество аргументов типа char*
. Далее в функции происходит следующее:
char* p = NULL;
- инициализируется указательp
с начальным значениемNULL
.va_list ap;
- инициализируется список аргументовap
.puts(str);
- выводится строкаstr
.va_start(ap, str);
- начинается проход по списку аргументов.- В цикле
while(p = va_arg(ap, char*))
происходит получение следующего аргумента типаchar*
и его вывод с помощьюputs(p)
. va_end(ap);
- заканчивается проход по списку аргументов. В основной части программы вызывается функцияmakeArr
с аргументамиa
,bm
,cdg
,ytttttt
,NULL
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д