首页 > 解决方案 > 定义 const char* 变量如何间接导致核心转储?

问题描述

我已经运行了这个:

int main(){
    //const char* variable="Hello, World!";//random string
    for(char i=0;i<10;i++){//random limit
        char* arr;
        arr[0]=42;//random number
    }

    return 0;
}

它没有转储核心。但是当我取消注释注释行并再次运行它时,它会产生以下错误消息:

/usr/bin/timeout: the monitored command dumped core
sh: line 1: 14403 Segmentation fault      /usr/bin/timeout 10s main

我正在使用https://www.tutorialspoint.com/compile_c_online.php

为什么会发生这种情况,我能做些什么来防止它发生?

标签: c

解决方案


arr[0]=42;

是相同的

*(arr + 0)=42;

并且

*arr=42;

因此,您将值 42 放入arr指向的对象中。但是,您这样做:

char* arr;

soarr未初始化,它可能指向“任何地方”,包括会导致崩溃的非法地址。它也可能指向某个合法地址,在这种情况下程序似乎可以工作。所以有时它会崩溃,有时它似乎工作。这通常称为“未定义的行为”。你不知道这样的代码会做什么......

为了防止这种情况,您需要初始化arr以指向一个有效的对象。

例如:

char* arr = malloc(sizeof *arr);

推荐阅读