2015-10-11 2 views
0

Я не могу найти проблему с кодом ниже. Я получаю предупреждающее сообщение «операция на« ptr »может быть неопределенной» в инструкции printf. Кроме того, результат выводится в обратном порядке (7 печатается aganst element1 и 2 против element2)печать нескольких значений с использованием указателя в printf

int main() 
{ 
    int a[4] = {2,7,9,0}; 
    int *ptr=a; 
    printf("Element1 = %d Element 2 = %d", *ptr, *ptr++); 
    ptr++; 
    return 0; 
} 
+0

Вы пишете этот мусор, поднимите его за домашнее задание или скопируете его из какой-либо книги или сайта? –

ответ

4

Стандарт Си не определяет, в каком порядке параметры получить оценку. Попробуйте использовать * (ptr + 1) вместо * ptr ++, который также можно заменить на ptr [1].

+0

И не определяет, когда приращение происходит за пределами 'до того, как произойдет фактический вызов 'printf()' происходит. –

+0

@JonathanLeffler и большинство реализаций оценивают параметры справа налево, нет? –

+1

@ A.S.H: Я не знаю, какие реализации порядка оценивают их аргументы; Я никогда не потрудился исследовать, так как поведение может меняться от системы к системе, компилятора к компилятору, версии к версии или даже по прихоти компилятора во время одной компиляции. Мне не нужна информация - я бы посоветовал вам лучше не знать, и убедиться, что ваш код работает правильно, независимо от того, какой заказ выбирает компилятор. –

2

Там нет sequenceing or specified evaluation order для аргументов функции, так что вы не знаете, какой аргумент будет оценены первым, *ptr или *ptr++ (или даже строка символов), что приводит к непредсказуемому поведению .

Смежные вопросы