繁体   English   中英

动态分配二维数组时出错 - ISO C90 禁止可变长度 (C89/C90)

[英]Error when dynamically allocating a 2D array - ISO C90 forbids variable length (C89/C90)

我正在尝试为小型游戏的 map 编程一个二维动态分配的数组。 下面是我的代码,我不确定为什么 int* array[yCoord] 会抛出它不能是可变长度数组的错误,因为变量 yCoord 在下面的主 function 中分配了一个特定值。 非常感谢任何帮助。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include"random.h"

void createMap(int xCoord, int yCoord) {
    int i, j;
    xCoord += 2;
    yCoord += 2;
    int* array[yCoord];
    for (i = 0; i < yCoord; i++) {
        array[i] = (int*)malloc(xCoord * sizeof(int));
    }
    for (i = 0; i < yCoord; i++) {
        for (j = 0; j < xCoord; j++) {
            array[i][j] = 0;
        }
    }
}

int main(void) {
    int x, y;
    x = 5;
    y = 5;
    createMap(x, y);
    return 0;
}

int* array[yCoord]; 是一个可变长度数组 (VLA),因为维度是在运行时根据另一个变量确定的。 在这种情况下也是非常值得怀疑的,因为该数组只存在于 function 内部,您不能将其返回给调用者。 另请注意,糟糕的老师/书籍有教你如何 malloc 2D arrays 错误的习惯 - 正确分配多维 arrays如果他们知道,请与你的老师分享。

VLA 在 1999 年被引入 C 语言。因此,如果您使用的编译器超过 23 年,或者明确告诉您使用该语言的过时版本进行编译,则代码将无法编译。 因此,“ISO C90 禁止可变长度 (C89/C90)” - 您的编译器使用的是自 1989 年以来已过时的 C 版本。

我强烈建议从这个千年升级到编译器。 对于旧版本的 gcc,这意味着正确执行它们,因为它默认为 C90(或者更确切地说是“GNU90”)一直到版本 5.0.0。 请参阅为初学者学习 C 推荐哪些编译器选项? 如那里所述, -ansi开关是有害的,因为它并不意味着“严格符合标准”,而是“符合 ANSI/ISO 1989 的标准”。 切换-ansi-std=c99-std=c11-std=c17 (C 的当前版本)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM