Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
15 / 15 / 11
Регистрация: 25.04.2014
Сообщений: 39
1

Странное расположение в памяти аргументов функции с неизвестным количество аргументов

08.11.2015, 17:24. Показов 694. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Не могу понять, почему такая программа не работает, выдавая segmentation fault после распечатки первой строки:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;
}
Но если поменять сдвиг, на 3, то все начинает работать:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;
}
Я же правильно понимаю, что аргументы должны идти в памяти друг за другом? Их размер по 8 байт, т.к. 64 разрядная система и указатели, но арифметика указателей сама это учитывает. Но откуда же берется сдвиг и как его узнать нормально?

Возможно, это связанно с компьютером, на котором компилируется программа. У меня Ubuntu, x64. Компилирую обычным gcc в консоли.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.11.2015, 17:24
Ответы с готовыми решениями:

Отсутствуют экземпляры перегруженная функция "pow", соответствующие списку аргументов типы аргументов: (<unknown-type>, double)
#include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;iostream&gt; int main() { double x, y, z, a, b;...

Макросы и переменное количество аргументов
Доброго дня! В двух словах, есть в цикле функция принимающая переменное кол-во аргументов, вот и...

Слишком много аргументов у функции
Есть код в main int i, j, y, x1, y1; char f1, f2; ....................... ...

Структура в качестве аргументов функции
здравствуйте, подскажите вот такая фиговина будет работать? struct A{ float x, y; };...

2
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
08.11.2015, 17:53 2
Цитата Сообщение от Epicus Посмотреть сообщение
Я же правильно понимаю, что аргументы должны идти в памяти друг за другом?
Аргументы кладутся в соответствии с программными соглашениями конкретной архитектуры

Добавлено через 35 секунд
Цитата Сообщение от Epicus Посмотреть сообщение
Но откуда же берется сдвиг и как его узнать нормально?
Для этого есть va_start и va_arg. Нужно пользоваться ими, а не писать гавнокод

Добавлено через 3 минуты
Вот описание классической ошибки - Как перенести параметры из ф-ции printf() в самодельную

Вот пример того, где эта ошибка проявляется - Как перенести параметры из ф-ции printf() в самодельную

Вот примерное объяснение, почему это гавнокод - Как перенести параметры из ф-ции printf() в самодельную
1
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
08.11.2015, 17:56 3
C
1
2
3
4
5
6
7
8
9
10
11
12
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);
1
08.11.2015, 17:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.11.2015, 17:56
Помогаю со студенческими работами здесь

Функции с переменным числом аргументов
Дело было в дизеле после университета. Хотел написать функцию, в которой заранее не будет...

Порядок вычисления аргументов функции printf
Добрый день, скажите пожалуйста, вот есть код ниже. #include &lt;stdio.h&gt; int main(){ int...

Последовательность вычисления аргументов функции и выражения
Здравствуйте! sum+=((f(x))+f(x+=e))/2.0*e; При использовании данного выражения, возникает...

Арифметические действия с использованием аргументов в функции main
#include &lt;stdio.h&gt; char onepluss (char a) { return a + 1 ; }


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru