为什么printf
以下会导致细分错误?
#include <stdio.h>
int main()
{
int *intp = {1,2,3,4,5};
printf("%d", *intp);
return 0;
}
在onlinegdb.com上进行检查
答案 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};
会做这份工作。