为什么低于printf
会导致分段故障?
#include <stdio.h>
int main()
{
int *intp = {1,2,3,4,5};
printf("%d", *intp);
return 0;
}
查看在线gdb.com
在您的例子中,您试图用一个包含大括号的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};
会胜任这项工作。