[英]Why below printf causes segmentation fault?
为什么低于printf
会导致分段错误?
#include <stdio.h>
int main()
{
int *intp = {1,2,3,4,5};
printf("%d", *intp);
return 0;
}
在您的情况下,您尝试使用括起来的int
初始化列表初始化一个指针,该列表无效。
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语句对其进行初始化,但不能使用指针进行初始化。
然后,稍后,当您尝试取消引用时,实际上是在尝试取消引用无效内存,这会调用未定义的行为 。
将您的代码更改为类似
int intp[] = {1,2,3,4,5};
会做的工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.