c - 没有定义初始化变量时发生的分段错误
问题描述
我正在使用 C 语言中的指针。我在处理指针时遇到了问题。
#include<stdio.h>
#include<stdlib.h>
int main(){
int x = 1, y = 2, z[10];
int *ip;
printf("initial value of x:%d\n",x);
printf("initial value of y:%d\n",y);
printf("inital value of ip: %d\n",*ip);
return 0;
}
该程序正常运行。但是在下面的程序中,当没有定义初始化变量时会发生分段错误。
#include<stdio.h>
#include<stdlib.h>
int main(){
int x = 1, y = 2;
int *ip;
printf("initial value of x:%d\n",x);
printf("initial value of y:%d\n",y);
printf("inital value of ip: %d\n",*ip);
return 0;
}
为什么会出现这个错误?分割误差和变量定义有什么关系?
解决方案
为什么会出现这个错误?
这两个程序都包含未定义的行为,因此期望它们都不起作用。
问题是您正在取消引用未初始化的指针:
int *ip; // uninitialized, may contain any value
// ...
printf("...", *ip);
// ^^^ dereference
该取消引用可能会给您明显的随机数据、恒定值或给出分段错误。
究竟会发生什么取决于您的编译器、架构、操作系统、优化标志和其他细节。
分割误差和变量定义有什么关系?
没有关系。这里的定义z
是让你的第一个程序“似乎工作”是偶然的。一旦您更改其他内容(例如将编译器更新到新版本),它可能会再次停止“工作”。
推荐阅读
- php - Laravel 权限 Ubuntu VPS - 挖掘。Ocean -Runs but Can't create directory 错误,或者如果没有更改权限,这是一个独白无法打开 fs 500 er
- javascript - 我是 React.js 的新手并且有这个错误:“警告:React.createElement:类型无效”
- mysql - SQL:操作数据类型 - 浮点数到字符串
- hash - 什么是计算 Avro 模式哈希的好方法?
- sql - 如何在代码中创建一个“硬编码”的小 SQL 连接表?
- swift - Xcode 单元测试 - 单元测试运行时无法一致显示打印命令
- c# - C# 从文本文件创建对象 - System.NullReferenceException
- performance-testing - 在 Gatling 中传递运行时参数
- r - 在 R 中:如何有条件地更改观察值?
- mysql - 如何在两个关系表中实现 IF 条件?