用C语言中的变量参数全局定义数组

用C语言中的变量参数全局定义数组,c,scope,global,variable-length-array,C,Scope,Global,Variable Length Array,代码如下: int EdgeCount = 0; int numOfEdges = 0; void addEdge() { // some code numOfEdges++; } int EdgeWeightArray[numOfEdges]; // error 我希望以后使用带有可变参数的全局数组,但我不能这样做,因为没有定义,我们无法全局定义数组参数;定义并不是一件易变的事情。在我的代码中,numOfEdges是可变的,我无法将其设置为常量。EdgeWightArra

代码如下:

int EdgeCount = 0;
int numOfEdges = 0;

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

int EdgeWeightArray[numOfEdges]; // error
我希望以后使用带有可变参数的全局数组,但我不能这样做,因为没有定义,我们无法全局定义数组参数;定义并不是一件易变的事情。在我的代码中,numOfEdges是可变的,我无法将其设置为常量。

EdgeWightArray具有全局scobe,因此它必须是固定大小。但是numOfEdges当然不是一个常量表达式

您希望EdgeWightArray的大小是多少?你希望它在你增加了多少边后会增长吗?如果是这样的话,你需要研究动态内存分配;即malloc和realloc

无错误检查的简要示例:

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

为什么不使用一个全局int指针,用malloc分配内存和所需的元素数呢


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

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

void defineSize() {
    numOfEdges++;
}

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

这是对乔纳森答案的扩展

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

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

您的代码将如下所示:

#define MAX_EDGE_COUNT 1000
int EdgeCount = 0;

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

int EdgeWeightArray[MAX_EDGE_COUNT];

这个简单的问题让我很困惑,但在对哈希和图形进行了大量思考之后,我仍然无法解决这个问题。无法在全局/文件范围内使用。要么将其移动到某个函数,要么动态地分配给malloc。有关详细信息,请参阅。您应该为此使用指针:int*EdgeWightArray=0;。然后,您需要使用EdgeWightArray=mallocNumofEdge,sizeofint;分配内存;。使用此函数后,请不要忘记释放指针。我无法在其他函数中使用EdgeWightArray。。。。当我需要它供以后使用时,您能告诉我为什么使用大小为SizeOffegeWeightArray[0]吗。它总是给出“8”的大小。要打印,我使用“for loop”中的条件作为sizeofArray。因此,无论我改变什么,它都执行“8”次。我通过改变“for循环”条件解决了这个问题。但是我可以知道为什么大小保持为'8'EdgeWightArray=RealLoceEdgeWightArray,NumofEdge*SizeOffedgeWeightArray[0];尺寸=8。EdgeWightArray=RealLocEdgeWightArray,anySize大小仍为8。是的,但我的数组的元素不是固定的。它们会随着NumofEdge增加1而变化。大体上,我可以回忆三次函数,或者可以使用“n”次。但也许你现在已经有了一个上限,所以你可以用这个上限。另外,您可以使用C++ STD::vector来自动增加其大小。