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



为什么低于printf会导致分段故障?

#include <stdio.h>
int main()
{
int *intp = {1,2,3,4,5};
printf("%d", *intp);
return 0;
}

查看在线gdb.com

在您的例子中,您试图用一个包含大括号的ints初始化器列表来初始化指针,这是无效的。

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};

会胜任这项工作。

最新更新