为什么低于 printf 会导致分段错误?
printf
#include <stdio.h> int main() { int *intp = {1,2,3,4,5}; printf("%d", *intp); return 0; }
检查onlinegdb.com
在您的情况下,您尝试使用括号封闭的 int 的初始化列表初始化指针,该列表无效 .
int
int *intp = {1,2,3,4,5};
如果您尝试在启用了适当警告的情况下编译代码,您将看到编译器警告消息,如
source_file.c:在函数'main'中:source_file.c:9:18:警告:初始化使得整数指针没有强制转换[-Wint-conversion]int * intp = {1,2,3,4,5};^source_file.c:9:18:注意:(接近初始化'intp')source_file.c:9:20:警告:标量初始值设定项中的多余元素int * intp = {1,2,3,4,5};^source_file.c:9:20:注意:(接近'intp'的初始化)source_file.c:9:22:警告:标量初始化程序中的多余元素int * intp = {1,2,3,4,5};^source_file.c:9:22:注意:(接近初始化'intp')source_file.c:9:24:警告:标量初始值设定项中的多余元素int * intp = {1,2,3,4,5};^source_file.c:9:24:注意:(接近初始化'intp')source_file.c:9:26:警告:标量初始值设定项中的多余元素int * intp = {1,2,3,4,5};
您的代码中的此语句是违反约束的,并不代表任何有意义的内容 . 对于标量,初始值设定项应该是单个表达式:如 C11 中所述,章节§6.7.9
C11
标量的初始值设定项应为单个表达式,可选择用大括号括起来 . [...]
因此,括号括起的列表不是标量的合适初始化器 .
您可以将指针更改为数组并使用initializer语句初始化,但不能使用指针 .
然后,稍后,当您尝试取消引用时,您实际上是在尝试取消引用无效内存,该内存将调用undefined behaviour .
将代码更改为类似的代码
int intp[] = {1,2,3,4,5};
会做的 .
1 回答
在您的情况下,您尝试使用括号封闭的
int
的初始化列表初始化指针,该列表无效 .如果您尝试在启用了适当警告的情况下编译代码,您将看到编译器警告消息,如
您的代码中的此语句是违反约束的,并不代表任何有意义的内容 . 对于标量,初始值设定项应该是单个表达式:如
C11
中所述,章节§6.7.9因此,括号括起的列表不是标量的合适初始化器 .
您可以将指针更改为数组并使用initializer语句初始化,但不能使用指针 .
然后,稍后,当您尝试取消引用时,您实际上是在尝试取消引用无效内存,该内存将调用undefined behaviour .
将代码更改为类似的代码
会做的 .