【发布时间】: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在这里似乎没用......然后再次使用的编译器可以决定结果。