15 / 15 / 11
Регистрация: 25.04.2014
Сообщений: 39

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

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

Студворк — интернет-сервис помощи студентам
Не могу понять, почему такая программа не работает, выдавая 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
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; setlocale(LC_ALL,&quot;rus&quot;); ...

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

Слишком много аргументов у функции
Есть код в main int i, j, y, x1, y1; char f1, f2; ....................... if(f2&gt;48 &amp;&amp; f2&lt;53) { ...

2
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
08.11.2015, 17:53
Цитата Сообщение от 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
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.11.2015, 17:56
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru