C 中使用可变参数全局定义数组

问题描述 投票:0回答:4

这是代码:

int EdgeCount = 0;
int numOfEdges = 0;

void addEdge() {
    // some code
    numOfEdges++;
}

int EdgeWeightArray[numOfEdges]; // error

我希望稍后使用具有可变参数的全局数组,但我无法这样做,因为没有

#define
我们无法定义全局数组参数;并且
#define
不是一个可变的东西。在我的代码中
numOfEdges
是可变的,我无法使其保持不变。

c scope global variable-length-array
4个回答
1
投票

EdgeWeightArray
具有全局范围,因此它必须是固定大小。但
numOfEdges
当然不是常量表达式。

您期望

EdgeWeightArray
的尺寸是多少?当您增加
numOfEdges
时,您预计它会增长吗?如果是这样,您需要研究动态内存分配;即
malloc
realloc

没有错误检查的简短示例:

int numOfEdges = 0;
int *EdgeWeightArray;
void addEdge(some parameters) {
    //SOME CODE
    numOfEdges++;
    EdgeWeightArray = realloc(EdgeWeightArray, numOfEdges * sizeof(EdgeWeightArray[0]));
}

0
投票

为什么不使用全局 int 指针并使用 malloc() 分配所需元素数量的内存?

您尝试执行的操作是不可能的,因为全局变量的内存是在编译时计算的,并且 numOfEdges 的值是在运行时更新的。


0
投票

在我看来,您想要创建一个设计不佳的代码,其中大小具有全局范围,而向量必须具有局部范围才能存储在堆栈中(根据您的起点)。不管怎样,你可能会做这样的事情:

void defineSize() {
    numOfEdges++;
}

void useIt()
{
    int EdgeWeightArray[numOfEdges];
    /* Use EdgeWeightArray, once the function has been executed, \
       EdgeWeightArray will dissapear */
}

0
投票

这是对 Jonathons 答案的扩展。

如果您已经知道数组最多有多少个元素,则可以为数组使用固定大小。目前这可能会更快,因为没有发生重新分配。 但您必须确保使用此方法进行适当的错误处理。它可能很容易出错。

然后,您需要一个计数器来跟踪您的边缘,但您似乎已经拥有其中之一。

您的代码将如下所示:

#define MAX_EDGE_COUNT 1000
int EdgeCount = 0;

void addEdge() {
    // some code
    EdgeWeightArray[EdgeCount] = newEdge;
    EdgeCount++;
}

int EdgeWeightArray[MAX_EDGE_COUNT];
© www.soinside.com 2019 - 2024. All rights reserved.