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

C语言指针问题:输入5时*pScores输出16的原因求解

未初始化变长数组的随机值问题

你的代码核心问题在于未初始化的栈内存变量会保留随机残留值,具体分析如下:

  • 你定义的int scores[a];是C语言的变长数组(VLA),它被分配在栈内存中,但没有做任何初始化操作。栈内存会留存之前程序运行留下的垃圾数据,所以数组内的所有元素值都是不确定的。
  • int *pScores = &scores[0]; 让指针pScores指向了数组第一个元素的地址,因此*pScores和scores[0]本质上是对同一块内存的访问——理论上两者的值应该完全相同。你这次运行得到0和16只是随机巧合,换个环境或多次运行,结果可能完全不同,这属于C语言中的未定义行为。

要解决这个问题,只需在使用数组前初始化所有元素即可,比如用memset批量赋值:

#include <stdio.h>
#include <string.h>

int main(void) {
  int a=0;
  int sum=0;
  scanf("%d",&a);
  int scores[a];
  // 将数组所有元素初始化为0
  memset(scores, 0, sizeof(scores));
  int *pScores = &scores[0];
  printf("%d, %d\n",scores[0],*pScores);
}

或者用循环逐个初始化:

for(int i = 0; i < a; i++) {
    scores[i] = 0;
}

初始化后,scores[0]和*pScores的值都会是0,符合预期。

内容的提问来源于stack exchange,提问作者Joseph

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:15:30