【问题标题】:Define array globally with variable parameter in C在C中使用可变参数全局定义数组
【发布时间】:2018-06-14 13:16:07
【问题描述】:

代码如下:

int EdgeCount = 0;
int numOfEdges = 0;

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

int EdgeWeightArray[numOfEdges]; // error

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

【问题讨论】:

  • 这个简单的事情让我很困惑,在哈希和图表中思考了这么多之后我还是无法解决这个问题。
  • Variable Length Arrays (VLAs) 不能在全局/文件范围内使用。将其移动到某个函数或动态分配它 (malloc())。请参阅stackoverflow.com/questions/12363558/… 了解更多信息。
  • 您应该为此使用指针:int* EdgeWeightArray = 0;。然后您需要使用EdgeWeightArray = malloc(numOfEdges, sizeof(int)); 分配内存。使用后别忘了释放指针

标签: c scope global variable-length-array


【解决方案1】:

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

您希望EdgeWeightArray 的大小是多少?当您增加numOfEdges 时,您期望它会增长吗?如果是这样,您需要查看 动态 内存分配;即mallocrealloc

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

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

【讨论】:

  • 你能告诉我为什么你使用大小为sizeof(EdgeWeightArray[0])。它总是给出大小为 '8'。要打印,我使用 'for loop' 中的条件作为 sizeof(Array)。因此,无论我改变什么,它都会执行“8”次。我通过更改“for循环”条件解决了这个问题。但是我能知道为什么 size 仍然是 '8'
  • EdgeWeightArray = realloc(EdgeWeightArray, numOfEdges * sizeof(EdgeWeightArray[0])); SIZE = 8EdgeWeightArray = realloc(EdgeWeightArray, anySize) 大小仍为 8.
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 有了这个我不能在另一个函数中使用 EdgeWeightArray....虽然我需要它供以后使用
    【解决方案4】:

    这是对 Jonathons 答案的扩展。

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

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

    您的代码将如下所示:

    #define MAX_EDGE_COUNT 1000
    int EdgeCount = 0;
    
    void addEdge() {
        // some code
        EdgeWeightArray[EdgeCount] = newEdge;
        EdgeCount++;
    }
    
    int EdgeWeightArray[MAX_EDGE_COUNT];
    

    【讨论】:

    • 是的,但我的数组元素不固定。它们随着 numOfEdges 增加 1 而变化。在 main() 中,我可以调用函数 3 次,或者可以使用 'n' 次。
    • 没错。但也许你现在已经有了一个上限,所以你可以使用这个限制。或者,您可以使用 c++ std::vector 自动增加其大小。
    猜你喜欢
    • 2014-04-20
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    相关资源
    最近更新 更多