【发布时间】:2013-02-24 09:43:23
【问题描述】:
在问这个问题之前,我参考了this、this 和this 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 :-)