为何动态数组输入≥7或循环设为10时,输出始终仅6个变量?
问题分析与解决
你的代码核心问题是变长数组的声明时机错误:
- 声明数组
int dizi[n];时,变量n还没被用户输入初始化,此时n是栈内存里的随机垃圾值(你的环境里这个值刚好是6)。 - 变长数组的大小在声明时就固定了,后续哪怕用
scanf修改n,数组实际大小也不会变。 - 当你输入7或把循环条件改成10时,循环尝试访问数组越界的位置,这属于C语言的未定义行为——你的环境没崩溃,但数组实际大小还是最初的6,所以只会输出6个值。
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int i; int n; printf("N: "); scanf("%d", &n); // 先读取用户输入的n,确定数组大小 int dizi[n]; // 此时n已初始化,数组大小正确 srand(time(0)); for (i = 0; i < n; i++) { dizi[i] = rand(); printf("\n%d", dizi[i]); } return 0; }
兼容老编译器的替代方案
如果你的编译器不支持C99的变长数组(比如老版本MSVC),可以用动态内存分配实现:
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int i; int n; printf("N: "); scanf("%d", &n); // 动态分配内存 int *dizi = malloc(n * sizeof(int)); if (dizi == NULL) { // 检查内存分配是否成功 printf("内存分配失败\n"); return 1; } srand(time(0)); for (i = 0; i < n; i++) { dizi[i] = rand(); printf("\n%d", dizi[i]); } free(dizi); // 使用完释放内存 return 0; }
内容的提问来源于stack exchange,提问作者Khansokhua
相关产品推荐
相关产品推荐

