使用scanf_s获取输入作为数组长度创建一维数组时出现报错如何解决
报错原因
你写的int array[N];属于**变长数组(VLA, Variable Length Array)**语法,这是C99标准才加入的特性,且在C11及后续标准中被调整为可选实现特性。如果你使用的是MSVC这类默认不支持变长数组的编译器,就会直接在这一行触发编译报错。
修复方案
改用动态内存分配的方式实现可变长度的数组,配合指针操作即可,符合要求的修改后完整代码如下:
#include <stdio.h> #include <stdlib.h> int main(void) { unsigned int N; printf("%s", "Please enter a positive integer: "); // 注意scanf_s读取unsigned int对应的格式符是%u,你之前写的%d会有类型不匹配问题,这里一并修复 scanf_s("%u", &N); // 用malloc动态申请N个int大小的内存,返回的地址赋值给int类型指针 int* array = (int*)malloc(N * sizeof(int)); // 内存申请失败判空属于规范写法,避免访问空指针崩溃 if (array == NULL) { printf("内存申请失败"); return 1; } // 这里可以正常用数组下标方式操作array,比如array[0] = 1; 和普通数组用法完全一致 // ...你的业务逻辑... // 动态申请的内存使用完一定要释放,避免内存泄漏 free(array); array = NULL; return 0; }
注意事项
- 动态内存申请需要引入
stdlib.h头文件,malloc函数的返回值是void*类型,需要强转为对应数据类型的指针使用 - 动态申请的内存使用结束后必须调用
free()释放,否则会出现内存泄漏问题 - 后续操作
array指针时,可以直接用普通数组的下标写法array[i]访问对应位置的元素,和定长数组的操作习惯完全一致
内容的提问来源于stack exchange,提问作者Kareem
相关产品推荐
相关产品推荐

