【问题标题】:C programming 2D array malloc: Interesting values after every row. Seek explanationC 编程 2D 数组 malloc:每一行之后的有趣值。寻求解释
【发布时间】:2013-02-24 09:43:23
【问题描述】:

在问这个问题之前,我参考了thisthisthis SO 帖子:

在教朋友动态内存分配的时候,我写了一个简单的程序,sn-p如下:

matrix = (int**) malloc (sizeof(int*) * m);
for (i = 0; i < m; ++i)
matrix[i] = (int*) malloc (sizeof(int) * n);

for (i = 0; i < m; ++i)
  for (j = 0; j < n; ++j)
      matrix[i][j] = rand() % 100; /*some random value*/


for (i = 0; i < m; ++i)
{
  for (j = 0; j < n; ++j)
  {
      printf("(%8u)%-5d", &matrix[i][j], matrix[i][j]);
  }

  /* Print element just after the first row*/
  printf("(%8u)%-5d", matrix[i] + n, *(matrix[i] + n));

  /* Print second NEXT element just after the first row*/
  printf("(%8u)%-5d", matrix[i] + n + 1, *(matrix[i] + n + 1));
}

当我运行这个程序时

unmesh@unmesh-laptop:~/teaching/C/Day3$ ./matrix
Enter number of rows: 3
Enter number of columns: 3

(141189144)1    (141189148)2    (141189152)3    **(141189156)17**   (141189160)2    

(141189160)2    (141189164)3    (141189168)4    **(141189172)17**   (141189176)3    

(141189176)3    (141189180)4    (141189184)5    (141189188)135105(141189192)0 

我对 17 的值很好奇。如果我没记错的话,这次调用中有 3 次 malloc 调用,所以内存可能不连续,可以观察到。 但是我用 m=n=4 或 m=n=5 运行程序,然后我可以看到每一行后面的值 25。 对于 m=n=6 和 m=n=7,观察到值 33

更有趣的是,当 n 为奇数时(n=3 / n=5 ..),该值会在行结束后立即存储。 m=n=3 时的示例行

Values  1        2       3       17  
Address 100      104    108     112  

Next row starts from 116

n为偶数时,4字节后存储 m=n=2 时的示例行

Values  1        2       0       17  
Address 100      104    108     112  

Next row starts from 116

问题是这些值 17/25/33 来自哪里? 为什么它们总是一样的?我希望它们不是垃圾,一定有一些意义.. 我无法推断。请帮忙。

【问题讨论】:

  • 它不是存储在每一行之后,而是存储在每一行之前。来自malloc 的簿记数据。值是(number_of_elements / 2 + 1)*8 + 1,或者更好的是number_of_used_8_byte_blocks*8+1,但我不知道为什么+1 在那里。
  • 丹尼尔,公式 +1 :-)

标签: c malloc 2d internal


【解决方案1】:

您会看到内部记账信息 malloc 存储以跟踪已分配的块。此信息的精确性质和大小因系统而异,但通常情况下 malloc 会将请求的大小四舍五入,以便在结合其簿记信息时,生成的块是通常所需的最大对齐的倍数你的机器。在您的情况下,对齐看起来像是 8 个字节(两个整数),导致您看到的偶数/奇数行为。您看到的 17/25/33 值可能是已分配块的大小(包括填充和大小信息),其中最低位设置为指示正在使用的块。

【讨论】:

  • 感谢克里斯,这提供了一些见解。你能解释一下为什么这些值总是奇怪的吗?等式如果我问 malloc(8) 说 2 个整数,这个块不需要填充,那么 malloc 将如何计算 17 ?为什么这个值对于 n=3 保持不变?我也要去寻找 malloc 的实现。如果我想出明确的答案,我会重新发布
  • 丹尼尔和克里斯,看看这个解释是否合适:根据丹尼尔的评论,我认为公式中的 +1 是为了告诉第 n 个字节是免费的(用于分配)。即例如n=2,对于每一行 malloc 分配 16 个字节(8 + 4(用于簿记)+ 4(填充))并且当 n=3 时 malloc 知道从这里开始的第 17 个字节是空闲的,对于每一行 malloc 再次分配 16 个字节(12 + 4(簿记)+ 无填充),它再次知道下一个空闲内存块是第 17 个字节..
  • @Trojosh 我认为 Chris 是正确的,设置的最低位表示该块正在使用中。除此之外,您的实现中的malloc 似乎分配为 8 个字节的倍数,因此它是分配块的可用大小,加上用于簿记的四个字节(加上使用指示符)。
猜你喜欢
  • 2021-03-29
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
  • 2022-12-10
  • 2021-09-17
  • 2011-12-15
  • 1970-01-01
相关资源
最近更新 更多