首页 文章

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

提问于
浏览
-1

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

#include <stdio.h>

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

检查onlinegdb.com

1 回答

  • 1

    在您的情况下,您尝试使用括号封闭的 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

    标量的初始值设定项应为单个表达式,可选择用大括号括起来 . [...]

    因此,括号括起的列表不是标量的合适初始化器 .

    您可以将指针更改为数组并使用initializer语句初始化,但不能使用指针 .

    然后,稍后,当您尝试取消引用时,您实际上是在尝试取消引用无效内存,该内存将调用undefined behaviour .

    将代码更改为类似的代码

    int intp[] = {1,2,3,4,5};
    

    会做的 .

相关问题