2017-02-17 5 views
0

Я все время получаю сообщение об ошибке сегментации (ядро сбрасывания) всякий раз, когда я пытаюсь запустить эту программу на C.ошибка сегментации в этой программе указателей в C

#include <stdio.h> 

int main() 
{ 
    int i = 200, *p, *q, *r; 
    p,r = &i; 
    q = p; 
    *q = *p + 1; 
    printf("*p = %d\n", *p); 
    printf("*r = %d\n", *r); 
    return 0; 
} 

У него не было никаких r с на первый, но я должен был добавить r S в качестве псевдонима i, а затем добавить операторы печати для вывода разыменованного значения q и r.

+6

'p, r = & i;' как вы думаете, что эта линия делает? –

+2

[Что делает оператор запятой в C?] (Http://stackoverflow.com/questions/52550/what-does-the-comma-operator-do-in-c) – Lundin

ответ

1

Используйте это:

p = &i; 
r = &i; 

вместо

p,r = &i; 

UNINITIALIZED указатель плохо.

+0

'Неинициализированный указатель - это неопределенное поведение. 'без надлежащего контекста, это мусор. Как насчет 'int * p; p = NULL; '. 'p' был унициализирован, не так ли? –

+0

особенно неинициализированный указатель НЕ является неопределенным поведением. Вызов разыменовывается. –

6

В коде

p,r = &i; 

не присваивает p, он оставляет p неинициализированным. Затем, в тот самый момент, когда вы разыскали pq также, поскольку он был присвоен значением p), вы ударили undefined behavior, так как вы разыскиваете недопустимую память.

Вы должны использовать

p = r = &i; 

компиляции кода с соответствующими предупреждениями поддержкой и, с кодом, вы должны увидеть что-то похожее на

предупреждение: левый операнд выражения разделителями не имеет никакого эффекта [-Wunused-значение]

p,r = &i; 
^
0

//I write that as an answer because i still don't have 50 reputation

1: Я не понимаю, что вы хотите, что программа будет делать. использование q и r бесполезно.

2:p,r=&i; не является хорошей командой. использовать p=r=&i или p=&i; r=&i; или p=&i; r=p;

+0

Вторая точка не соответствует истине 'p, r = & i;' является допустимой командой, она просто ничего не делает с p. Плюс то, что вы сказали, уже покрыто sourav (за час до этого), чтобы вы ничего не добавляли. –

+0

i фиксированный ........ –

0

я сделал поправку в свой код и он работает нормально есть, пожалуйста, посмотрите в него.

`#include <stdio.h> 

int main() 
{ 
    int i = 200, *p, *q, *r; 
    p = &i; 
    r = &i;  
    q = p; 
    *q = *p + 1; 
    printf("*p = %d\n", *p); 
    printf("*r = %d\n", *r); 
    return 0; 
}` 
Смежные вопросы