繁体   English   中英

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

[英]Why below printf causes segmentation fault?

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

#include <stdio.h>

int main()
{
    int *intp = {1,2,3,4,5};
    printf("%d", *intp);
    return 0;
}

onlinegdb.com检查

在您的情况下,您尝试使用括起来的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM