使用C

时间:2018-06-14 13:16:08

标签: c scope global variable-length-array

以下是代码:

int EdgeCount = 0;
int numOfEdges = 0;

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

int EdgeWeightArray[numOfEdges]; // error

我希望带有可变参数的全局数组稍后使用它,但我不能这样做,因为没有#define我们无法定义全局数组参数;并且#define不是一个可变的东西。在我的代码中numOfEdges是可变的,我无法使其保持不变。

4 个答案:

答案 0 :(得分:1)

EdgeWeightArray有全局scobe,所以它必须是 fixed 大小。但numOfEdges当然不是一个持续的表达。

您期望EdgeWeightArray的大小是多少?当你增加numOfEdges时,你期望它会增长吗?如果是这样,你就不得不研究动态内存分配;即mallocrealloc

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

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

答案 1 :(得分:0)

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

您尝试做的事情是不可能的,因为全局变量的内存是在编译时计算的,而numOfEdges的值是在运行时更新的。

答案 2 :(得分:0)

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

void defineSize() {
    numOfEdges++;
}

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

答案 3 :(得分:0)

这是乔纳森回答的扩展。

如果您已经知道阵列的最大元素数量,则可以使用固定大小的阵列。这可能会更快,因为没有重新分配。 但是你必须确保使用这种方法进行适当的错误处理。它可能非常容易出错。

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

您的代码将如下所示:

#define MAX_EDGE_COUNT 1000
int EdgeCount = 0;

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

int EdgeWeightArray[MAX_EDGE_COUNT];