C语言用指针操作100元素一维数组报segmentation fault如何解决
现有代码问题
- 指针初始化越界:C语言数组下标从0开始,长度为100的
x数组合法下标范围是0~99,&(x[100])是数组尾部之外的非法内存地址,后续对该地址及后续地址的写入操作属于越界访问,直接触发段错误。 - 填充逻辑错误:循环中
myPtr持续向后偏移,所有写入操作都落在数组之外的非法内存区域,完全没有修改数组本身的内容。 - 访问逻辑错误:填充结束后
myPtr已经偏移到x[100] + 100的位置,此时解引用*myPtr属于非法内存访问。 - 缺少头文件:调用
printf需要引入<stdio.h>头文件,否则编译会出现警告。 - 未实现升序、降序输出的需求。
修正后完整代码
#include <stdio.h> int main(void) { // 创建大小为100的一维整型数组 int x[100]; int *myPtr; int j; // 需求a:指针填充0~99 myPtr = x; // 指针初始化为数组首地址,等价于&x[0] for (j = 0; j < 100; j++) { *myPtr = j; myPtr++; } // 需求b:指针升序输出 printf("升序输出结果:\n"); myPtr = x; // 指针复位到数组首地址 for (j = 0; j < 100; j++) { printf("%d ", *myPtr); myPtr++; } printf("\n"); // 需求c:指针降序输出 printf("降序输出结果:\n"); myPtr = &x[99]; // 指针指向数组最后一个元素 for (j = 0; j < 100; j++) { printf("%d ", *myPtr); myPtr--; } printf("\n"); return 0; }
代码说明
- 填充阶段指针从数组首地址开始偏移,每次写入当前下标值,确保所有数据写入数组合法内存区域。
- 升序输出前将指针复位到首地址,依次向后遍历100个元素完成打印。
- 降序输出前将指针指向数组最后一个合法元素
x[99],依次向前遍历100个元素完成打印。
内容的提问来源于stack exchange,提问作者Maikayla
相关产品推荐
相关产品推荐

