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

如何修改代码兼容ISO C90编译(解决变长数组报错问题)

解决ISO C90下变长数组编译错误的方法

C90(对应你使用的-std=gnu89编译选项)标准不支持变长数组(VLA),你代码里的int array[n];中n是运行时通过函数调用计算出的值,属于变长数组,因此触发编译错误。以下是两种可行的修改方案:

方案一:使用动态内存分配(推荐)

通过malloc在堆上分配内存,这是C90标准支持的灵活方案,能适配任意合法的n值。修改后的代码如下:

#include <stdlib.h>
#include <stdio.h> // 若使用perror需要此头文件

// ... 其他代码 ...

int i = 0, j = 0, k = 1;
int n = find_chars_number(s, sep, idx) + 1;
int *array = malloc(n * sizeof(int));
int o = 0;

// 必须检查内存分配是否成功,避免空指针访问
if (array == NULL) {
    perror("malloc failed");
    exit(EXIT_FAILURE); // 终止程序,也可根据需求自定义错误处理
}

array[0] = idx;

// ... 后续使用array的业务代码 ...

// 当不再需要array时,务必释放内存,避免内存泄漏
free(array);
array = NULL; // 将指针置空,防止后续误操作野指针

注意:malloc、free、exit和EXIT_FAILURE都定义在<stdlib.h>中,必须确保代码包含该头文件。如果array需要在当前函数外继续使用,不要在函数内释放内存,而是将释放责任交给调用者。

方案二:使用固定大小的静态数组(仅适用于n有明确上限的场景)

如果能确定find_chars_number返回值的最大值(比如不会超过1024),可以直接定义一个足够大的静态数组:

#define MAX_ARRAY_SIZE 1024 // 根据实际情况调整这个值

// ... 其他代码 ...

int i = 0, j = 0, k = 1;
int n = find_chars_number(s, sep, idx) + 1;

// 额外检查n是否超过数组上限,避免越界访问
if (n > MAX_ARRAY_SIZE) {
    fprintf(stderr, "array size exceeds maximum limit\n");
    exit(EXIT_FAILURE);
}

int array[MAX_ARRAY_SIZE];
int o = 0;

array[0] = idx;

这种方法无需手动管理内存,但灵活性差,如果n超过设定的上限会导致数组越界,引发未定义行为,因此仅推荐在n范围明确且固定的场景使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:05:25