![](/img/trans.png)
[英]How can I correctly handle malloc failure in C, especially when there is more than one malloc?
[英]C program: when I use malloc function, I find that there are always more bytes than size of the array
也许新代码可以解释我的意思。
#include <stdio.h>
#include <stdlib.h>
int main(void){
int i_size = 2, j_size = 5, k_size = 5, l_size = 6, m_size = 6;
int i = 0, j = 0, k = 0, l = 0, m = 0;
printf("ptr1\n");
int** ptr1 = (int**) malloc(sizeof(int*) * i_size);
for(i = 0; i < i_size; i++){
printf("%d\n", ptr1 + i);
}
printf("ptr2\n");
int** ptr2 = (int**) malloc(sizeof(int*) * j_size);
for(j = 0; j < j_size; j++){
printf("%d\n", ptr2 + j);
}
printf("ptr3\n");
int** ptr3 = (int**) malloc(sizeof(int*) * k_size);
for(k = 0; k < k_size; k++){
printf("%d\n", ptr3 + k);
}
printf("ptr4\n");
int** ptr4 = (int**) malloc(sizeof(int*) * l_size);
for(l = 0; l < l_size; l++){
printf("%d\n", ptr4 + l);
}
printf("ptr5\n");
int** ptr5 = (int**) malloc(sizeof(int*) * m_size);
for(m = 0; m < m_size; m++){
printf("%d\n", ptr5 + m);
}
free(ptr1);
free(ptr2);
free(ptr3);
free(ptr4);
free(ptr5);
return 0;
}
结果如下:
有趣的是,对于malloc
函数来说,数组的最小大小是32字节。 操作系统似乎保留了8个字节的空间,因为当我发现l_size
,它有64个字节。 这意味着如果你想要一个48字节的数组malloc,操作系统将分配超过48字节的空间。
更新以上
=====
我的代码如下所示:
#include <stdio.h>
#include <stdlib.h>
int main(void){
int i_size = 5, j_size = 6, i = 0, j = 0;
printf("Addresses of two dimensional pointer\n");
int** ptr = (int**) malloc(sizeof(int*) * i_size);
printf("%d:\t%d\n", &ptr, ptr);
for(i = 0; i < i_size; i++){
*(ptr + i) = (int*) malloc(sizeof(int) * j_size);
}
for(i = 0; i < i_size; i++){
for(j = 0; j < j_size; j++){
*(*(ptr+i) + j) = i * 2 + j;
}
}
for(i = 0; i < i_size; i++){
printf("%d:\t%d\n", ptr + i, *(ptr + i));
}
printf("==\n");
for(i = 0; i < i_size; i++){
for(j = 0; j < j_size; j++){
printf("%d:\t%d\t%d\n",*(ptr + i) + j, *(*(ptr + i) + j), ptr[i][j]);
}
printf("==\n");
}
for(i = 0; i < i_size; i++){
free(*(ptr + i));
}
free(ptr);
return 0;
}
结果如下图所示:
代码在Windows 10,64位上运行,并使用Dev C ++的TDM-GCC4.9.2进行编译。
我被红色块弄糊涂了。 为什么总是比数组大小多8个字节。 如果我将i_size
的值更改为6,则OS似乎将给ptr
64字节而不是48。
我希望值12021664
应该是12021648
。 如果我将i_size
的值更改为7,则可以:
但是当i_size
值为8时,我预计值10710960
应为10710944
。 但它不起作用。
ptr
指向int *
的数组。 在您的系统上,指针的大小似乎是8个字节,因此数组的每个成员都是8个字节。
然后,当您将每个成员的地址打印为ptr + i
,您会看到它们各自相差8。
此外,您应该使用%p
来打印指针而不是%d
。 使用错误的格式说明符调用未定义的行为 。
关于malloc
返回的特定内存地址,这些是库的实现细节。 不要求连续分配在内存中应该相邻。 实际上,它们不相邻是有意义的,因为可能有一些元数据存储在malloc
内部使用的那些中间地址中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.