先将数组大小初始化为0后让用户输入,程序为何无法正常工作?
为什么先初始化size为0再定义数组,无法得到用户指定大小的数组?
问题原因
- 变长数组(VLA)的大小是在定义时就确定死的,后续修改
size的值不会改变已创建数组的大小。你代码里int arr[size];执行时,size的值是0,所以数组的实际大小就是0。 - 大小为0的数组属于C标准里的未定义行为,编译器可能允许编译,但运行时访问这种数组会直接触发内存越界,导致程序异常。
正确写法
方法1:先获取size再定义变长数组
先通过scanf拿到用户输入的size,再用这个值定义数组,同时要校验size的合法性:
int size; // 先获取用户输入的数组大小 scanf("%d", &size); // 确保size是正整数,避免非法大小 if (size <= 0) { printf("数组大小必须是正整数\n"); return 1; } // 此时size是合法值,定义对应大小的数组 int arr[size];
方法2:使用动态内存分配(更灵活)
如果需要在程序运行中调整数组大小,或者担心栈内存不足(变长数组在栈上分配,太大容易栈溢出),可以用malloc动态分配内存:
int size; scanf("%d", &size); if (size <= 0) { printf("数组大小必须是正整数\n"); return 1; } // 动态分配内存,注意检查分配是否成功 int *arr = malloc(size * sizeof(int)); if (arr == NULL) { printf("内存分配失败\n"); return 1; } // 这里可以正常使用arr数组,比如赋值、访问元素 // 使用完毕后必须释放内存,避免内存泄漏 free(arr);
内容的提问来源于stack exchange,提问作者Ehsan
相关产品推荐
相关产品推荐

