c - 定义 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。
为什么会发生这种情况,我能做些什么来防止它发生?
解决方案
arr[0]=42;
是相同的
*(arr + 0)=42;
并且
*arr=42;
因此,您将值 42 放入arr
指向的对象中。但是,您这样做:
char* arr;
soarr
未初始化,它可能指向“任何地方”,包括会导致崩溃的非法地址。它也可能指向某个合法地址,在这种情况下程序似乎可以工作。所以有时它会崩溃,有时它似乎工作。这通常称为“未定义的行为”。你不知道这样的代码会做什么......
为了防止这种情况,您需要初始化arr
以指向一个有效的对象。
例如:
char* arr = malloc(sizeof *arr);
推荐阅读
- c++ - C++:我的 switch-case 循环转到第一种情况
- jquery - ASP.Net MVC:Json 数据在服务器端操作为空
- visual-studio - 如何在视觉工作室中解决这个问题?
- javascript - 客户端未在 discord bot 模块中定义
- javascript - 如何使用 node/python 从本地网络外部访问 Hue Lights?
- opencv - 图像角落的相机校准
- c# - 当从其他类实现函数而不是直接在单个函数中工作时,Json 数据返回非常混乱
- laravel - Lumen 应用程序在 Web 中访问时 API 消息无效
- javascript - 如何使用 html 和 javascript 创建可拖动和可调整大小的 div
- scala - 为什么在 for 表达式中设置多个 val 不会导致异常?