You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 09:43:34