Почему ниже printf вызывает ошибку сегментации? - PullRequest
0 голосов
/ 10 декабря 2018

Почему ниже printf вызывает ошибку сегментации?

#include <stdio.h>

int main()
{
    int *intp = {1,2,3,4,5};
    printf("%d", *intp);
    return 0;
}

Проверьте это на onlinegdb.com

1 Ответ

0 голосов
/ 10 декабря 2018

В вашем случае вы пытаетесь инициализировать указатель с помощью заключенного в скобки списка инициализаторов int s, что недопустимо.

int *intp = {1,2,3,4,5};

Если вы пытаетесь скомпилировать код с включенными надлежащими предупреждениямивы увидите предупреждающие сообщения компилятора, такие как

source_file.c: In function ‘main’:
source_file.c:9:18: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
     int *intp = {1,2,3,4,5};
                  ^
source_file.c:9:18: note: (near initialization for ‘intp’)
source_file.c:9:20: warning: excess elements in scalar initializer
     int *intp = {1,2,3,4,5};
                    ^
source_file.c:9:20: note: (near initialization for ‘intp’)
source_file.c:9:22: warning: excess elements in scalar initializer
     int *intp = {1,2,3,4,5};
                      ^
source_file.c:9:22: note: (near initialization for ‘intp’)
source_file.c:9:24: warning: excess elements in scalar initializer
     int *intp = {1,2,3,4,5};
                        ^
source_file.c:9:24: note: (near initialization for ‘intp’)
source_file.c:9:26: warning: excess elements in scalar initializer
     int *intp = {1,2,3,4,5};

Это утверждение в вашем коде является нарушением ограничения и не означает ничего значащего.Для скаляра инициализатор должен быть одним выражением: как указано в C11, глава §6.7.9

Инициализатором скаляра должно быть одно выражение, необязательно заключенное в фигурные скобки.[...]

Таким образом, заключенный в скобки список не является подходящим инициализатором для скаляра.

Вы можете изменить указатель на массив и инициализировать его с помощью инициализатораоператор, но не указатель.

Затем, позже, когда вы пытаетесь разыменовать, вы по существу делаете попытку разыменовать недопустимую память, которая вызывает неопределенное поведение .

Изменение кода на что-то вроде

 int intp[] = {1,2,3,4,5};

сделает эту работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...