为何C语言中指向数组0号索引的指针取值与实际0号索引值不符?
数组指针访问元素的异常问题
我是一名Python开发者,仅掌握C语言基础,现需完成一项任务:接收用户输入的n个数组元素,编写一个以数组指针为参数的函数来访问该数组的元素。
我最初的简化代码如下:
#include<stdio.h> void func(int *pArr, int size){ for (int j = 0; j < size; j++){ printf("%d ",*(pArr+j)); } } int main(){ int n; printf("Enter the number of elements you want in your list: "); scanf("%d", &n); int a[n]; for (int i = 1; i <= n; i++){ printf("Enter element no.%d: ", i); scanf("%d", &a[i]); } func(&a[0], n); return 0; }
测试时输入数组元素1,3,9,8,2,输出为:
863014944 1 3 8 9
(pArr+0)输出垃圾值,后续值看似正常。修改func函数的循环j从1开始且条件改为j<=size后程序运行正常,我对此感到困惑:若pArr指向a[0],(pArr+1)应返回a[1],为何实际返回a[0]?为何*(pArr+0)不等于a[0]?
问题根源
核心错误出在main函数的输入循环下标处理:
- C语言数组下标从0开始,你写的循环
for (int i = 1; i <= n; i++)将输入值存入&a[i],导致第一个输入的元素被放到了a[1],而非正确的a[0] a[0]从未被赋值,内存中保留的是随机垃圾值,这就是*(pArr+0)输出垃圾值的原因- 当i等于n时,你访问了
a[n],这超出了数组a[n]的合法下标范围(合法下标是0到n-1),属于越界访问,会触发未定义行为
现象解释
func函数中pArr确实指向a[0]:
- *(pArr+0)就是a[0],自然是未初始化的垃圾值
- (pArr+1)是a[1],对应你输入的第一个元素1;(pArr+2)是a[2],对应输入的第二个元素3,以此类推,所以后续输出看似“正常”,但本质是元素存储错位导致的结果
修正后的代码
#include<stdio.h> void func(int *pArr, int size){ for (int j = 0; j < size; j++){ printf("%d ",*(pArr+j)); } } int main(){ int n; printf("Enter the number of elements you want in your list: "); scanf("%d", &n); int a[n]; // 修正循环下标,从0开始遍历数组合法范围 for (int i = 0; i < n; i++){ printf("Enter element no.%d: ", i+1); // 显示给用户的序号仍从1开始,符合使用习惯 scanf("%d", &a[i]); } func(&a[0], n); // 也可以直接传数组名a,数组名会隐式转换为指向首元素的指针 // func(a, n); return 0; }
修改后,输入元素会被正确存入数组的对应位置,func函数的指针访问也能匹配到正确元素,输出结果会和输入完全一致。
内容的提问来源于stack exchange,提问作者Sarthak Katiyar
相关产品推荐
相关产品推荐

