为什么低于printf会导致分段错误?

时间:2018-12-10 05:05:31

标签: c arrays pointers

为什么printf以下会导致细分错误?

#include <stdio.h>

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

onlinegdb.com上进行检查

1 个答案:

答案 0 :(得分:1)

在您的情况下,您尝试使用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章中所述

  

标量的初始值设定项应为单个表达式,可以选择用大括号括起来。 [...]

因此,括号括起来的列表不适用于标量。

您可以将指针更改为数组,并使用initializer语句对其进行初始化,但不能使用指针。

然后,稍后,当您尝试取消引用时,您实际上是在尝试取消引用无效内存,该内存调用undefined behaviour

将代码更改为类似的内容

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

会做这份工作。