为什么这段C语言代码会产生段错误?
段错误原因分析
你的代码如下:
#include <stdio.h> int main() { int i,a; int* p; p=&a; for(i=0;i<=10;i++) { *(p+i)=i; printf("%d\n",*(p+i)); } return 0; }
错误原因
- 你只定义了单个
int变量a,指针p指向的是a的内存地址,这只是单个int大小的合法内存空间。 - 循环中当
i≥1时,*(p+i)会访问a之后的连续内存区域,但这部分内存根本没被你的程序申请分配,属于非法内存越界访问。 - 操作系统会严格管控内存权限,当程序试图读写不属于自己的内存时,就会触发段错误(Segmentation Fault)来终止程序,防止非法操作破坏系统或其他程序的内存。
正确实现方式
如果想不用数组存连续的11个int数据,应该用动态内存分配从堆上申请连续空间:
#include <stdio.h> #include <stdlib.h> int main() { int i; // 分配能存储11个int的连续内存块 int* p = malloc(11 * sizeof(int)); // 必须检查内存分配是否成功 if (p == NULL) { printf("内存分配失败\n"); return 1; } for(i=0;i<=10;i++) { *(p+i)=i; printf("%d\n",*(p+i)); } free(p); // 用完记得释放动态分配的内存,避免内存泄漏 return 0; }
内容的提问来源于stack exchange,提问作者Palarax dope palarax
相关产品推荐
相关产品推荐

