首页 > 解决方案 > 没有定义初始化变量时发生的分段错误

问题描述

我正在使用 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;
}

为什么会出现这个错误?分割误差和变量定义有什么关系?

标签: cpointerssegmentation-fault

解决方案


为什么会出现这个错误?

这两个程序都包含未定义的行为,因此期望它们都不起作用。

问题是您正在取消引用未初始化的指针:

int *ip; // uninitialized, may contain any value

// ...

printf("...", *ip);
           // ^^^ dereference

该取消引用可能会给您明显的随机数据、恒定值或给出分段错误。

究竟会发生什么取决于您的编译器、架构、操作系统、优化标志和其他细节。

分割误差和变量定义有什么关系?

没有关系。这里的定义z是让你的第一个程序“似乎工作”是偶然的。一旦您更改其他内容(例如将编译器更新到新版本),它可能会再次停止“工作”。


推荐阅读