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
相关产品推荐
相关产品推荐

