【问题标题】:Malloc not needed to create inner array [duplicate]Malloc 不需要创建内部数组 [重复]
【发布时间】:2017-04-02 14:47:34
【问题描述】:

我正在尝试将注意力完全集中在 malloc 和内存分配上。我最近遇到了一个让我皱起眉头的情况。

在摆弄数组时,我正在创建一个数组数组。在我看来,它看起来像这样: [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], ...] 这样做时,我想因为我需要 malloc 来创建外部数组。我还需要为我正在创建的每个内部数组调用 malloc。我很快意识到,当我跳过这对我来说毫无意义的步骤时,我得到了相同的输出。

考虑以下脚本。

int main(int argv, char* argc[]){

    // initialize outer array
    int* outer = malloc(5 * sizeof(int));

    int i, j;

    // for each slot in outer array
    // create a new array and assign it
    // to that slot.
    // NOT NEEDED.
    for(i = 0; i < 5; i++){
        int* inner = malloc(5 * sizeof(int));
        *(outer + i) = *inner;
    }
   // If I comment out the above four lines
   // the output remains the same.

    // assign to each slot in each inner array
    for(i = 0; i < 5; i++)
        for(j = 0; j < 5; j++)
            *(outer + i * 5 + j) = j;

    // print each element in each inner array
    for(i = 0; i < 5; i++){
        for(j = 0; j < 5; j++){
            printf(
                "%d ",
                *(outer + i * 5 + j)
            );
        }
        puts("");
    }
}

此脚本的输出如下:

0 1 2 3 4 
0 1 2 3 4 
0 1 2 3 4 
0 1 2 3 4 
0 1 2 3 4 

这是我所期望的。但是当我注释掉脚本中的第一个 for 循环时,我得到了相同的输出。为什么是这样?我不需要为内部数组分配内存吗?显然答案是否定的,但我试图理解为什么会这样。

【问题讨论】:

  • 这背后的想法到底是什么:... = *inner;?
  • @alk 为外部数组中的那个索引,分配一个新的内存空间。
  • 即使问题是 c++ 也可能会有所帮助:stackoverflow.com/questions/4316736/…
  • 谢谢@CherubimAnand
  • 最初的malloc(使用 clang 编译时)用于最后两个循环; for 循环中的malloc 在这里似乎没用......然后再次使用的编译器可以决定结果。

标签: c arrays malloc


【解决方案1】:

简答:Undefined behavior.

当您未能为内部数组分配内存时,指针未初始化,因此它们指向某个未指定的内存位置。

由于未定义的行为,您的程序可能会崩溃,它可能会以某种意想不到的方式运行,或者它可能(如您的情况)似乎正常工作。看似无关的更改(例如添加未使用的变量)可能会导致程序行为发生更改。

【讨论】:

  • 那么,我的第一个直觉是必须为每个内部数组分配内存是正确的吗?
  • @marcusshep 正确,你需要为内部数组分配内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 1970-01-01
  • 2016-03-10
相关资源
最近更新 更多