【问题标题】:C Array memory allocationC 数组内存分配
【发布时间】:2013-11-22 04:51:41
【问题描述】:

我真的是 C 的新手,有些东西困扰着我......

我声明了一个 typedef:

    typedef struct{
        double
            real,
            img;
    }complex;

并且,在一个函数中,我声明了以下数组:

    complex system[MAX_NODES+1][MAX_NODES+2];

函数对这个数组的元素做的第一件事是初始化它们,但是应用程序会在运行时编译并崩溃,除非还声明了另一个具有相同维度和类型的数组(即使它没有被使用) :

    complex system1[MAX_NODES+1][MAX_NODES+2],
    complex system[MAX_NODES+1][MAX_NODES+2];

这让我相信这是一个内存问题,也许第一个系统正在分配所需的内存......是这样吗?如果有,为什么?

MAX_NODES 是一个设置为 300 的常量,所以我认为数组声明已经在分配内存了……我应该真的使用 malloc 吗?

无论如何,将系统声明为静态似乎可以解决问题:

    static complex system[MAX_NODES+1][MAX_NODES+2];

我只是不知道为什么...我知道函数内的静态变量使该变量在后续函数调用中保持其值,但是这与内存或这个问题有什么关系?有什么建议吗?

非常感谢。

【问题讨论】:

  • 您的代码听起来很合理。你能提供更多的上下文吗?您是否有可能试图在其范围之外(例如,在函数之外)访问数组?
  • 需要展示真实的、可编译的代码——包括初始化。
  • 问题出在你的初始化函数中。我认为我们需要看到它。
  • 之后运行的初始化函数如下所示: void initialize_system(complex system[MAX_NODES+1][MAX_NODES+2]){ int lines, columns; for (lines = 0; lines pastebin.com/ZEfLDCJn 问题在 mna 函数内部。谢谢!

标签: c arrays memory-management static malloc


【解决方案1】:

您的代码:

for (lines = 0; lines <= MAX_NODES+1; lines++)
{ 
     for (columns = 0; columns <= MAX_NODES+2; columns++){ 

应该是

for (lines = 0; lines < MAX_NODES+1; lines++)
{ 
     for (columns = 0; columns < MAX_NODES+2; columns++){ 

否则,您会将两个数组维度都超出 1 - 因此会出现内存错误。

【讨论】:

  • 对于 OP 的信息 - 它与额外的数组或静态“工作”的事实只是一个巧合(尽管很容易解释)。
  • 并非巧合:它“有效”是因为额外的数组提供了一个缓冲区——堆栈上的额外内存没有被使用,并且可以“合法地”访问。因为它是在编译时分配的没有指针被覆盖,一切都很好。
  • 非常感谢,就是这样 :) 不过,您能说一下为什么静态变量显然可以解决问题吗?
  • 静态变量创建在与函数中的变量不同的内存区域中(尽管这取决于实现),所以当它超调时,它会丢弃一些不同的东西——也许是无害的,也许不是.如果您超调,函数中的变量将破坏堆栈 - 这解释了为什么向堆栈添加另一个变量(有效的内存块)会改变行为。基本上,一旦你超出内存,会发生什么是任何人的猜测,并且将取决于编译器、环境、周围的变量、风向...等等。
  • @Floris 正如我所说,很容易解释。但我记得,它仍然是 UB。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多