2015-04-02 2 views
-1
#include <stdio.h> 
int a; 
int *b; 
int **c; 
int ***d; 
int ****e; 
// * is the "value of operator" 
// * is also called the dereferencing // operator 

int main(void) { 
    a = 25; 
    b = &a; // & is the "address of operator" c = &b; 
    d = &c; 
    e = &d; 

    printf("\n\n%d %d %d\n\n",*(&a),*b+**c, ***d*****e); 

    return 0; 
} 

Когда я запускаю его, он говорит, что ошибка сегментации: 11 как я могу ее исправить и что это значит?C программирование Ошибка сегментации: 11

+0

Вы сделали 'c = & b;' как комментарий по ошибке. – Himanshu

+0

@ Химаншу нет, это ошибка __actual__ в случае OP. –

+0

http://ideone.com/tmLN3x – Gopi

ответ

0

Вы пропустили

c = &b; 

Без этого у вас есть c неинициализированный и вы используете его, что приводит к непредсказуемому поведению

1

Я думаю, в вашем коде

c = &b; 

часть закомментирована по ошибке. Таким образом, значение c равно NULL (глобальный охват) и которое разыменовывается и используется в аргументе printf(), что в свою очередь может вызвать undefined behaviour.

Segmentation fault является одним из побочных эффектов неопределенного поведения. В основном это указывает на нарушение доступа к памяти.

FYI, C11 стандартный документ, глава 6.5.3.3,

Унарный * оператор обозначает косвенность. Если операнд указывает на функцию, результатом будет - обозначение функции; если он указывает на объект, результатом является значение l, обозначающее объект . Если операнд имеет тип ‘‘pointer to type’’, результат имеет тип ‘‘type’’. Если для указателя присвоено недопустимое значение , поведение унарного оператора * равно неопределенным.

и reagarding недопустимого значения из сноски 102 в той же главе

Среди недопустимых значений для разыменования указателя на одноместный оператор * является пустым указатель, [... ...]

Решение: Раскоментируйте что часть.

0

Вам не хватает строки в комментарии.

c=&b; 

Именно по этой причине вы получаете ошибку сегментации.

Для лучшего понимания вы можете сделать это.

printf("\n\n%d %d %d\n\n",*(&a),*b +**c, (***d)*(****e)); 
0

Значение c не инициализировано, и мы пытаемся использовать ссылку этой переменной на d, поэтому pl. add c = & b до d = & c и это должно решить вашу проблему