我想为下面的2d int ptr分配内存,但我不是100%肯定我已经正确地完成了,所以任何指针(哈哈)都会很棒。我在for循环中释放数组及其索引的方式是正确的吗?还有,第一个malloc
和第二个malloc
的区别是什么:(int *)
和(int)
?
int **array = NULL;
int mem_size = 0;
int i = 0, j = 0;
// leaving out how mem_size is calculated, but it can vary
array = malloc(sizeof(int *) * mem_size);
if (array == NULL) {
// some error message
return;
}
for (i = 0; i < mem_size; i++) {
array[i] = malloc(sizeof(int) * 2);
if (!(array[i])) {
// some error message
for (j = 0; j < i; j++)
free(array[j]);
free (array);
return;
}
}
这只是我写的代码的一部分。最后,我释放了数组:
for (i = 0; i < mem_size; i++)
free(array[i]);
free(array);
这只是一个编译时常量——第一种情况是指针的大小,第二种情况是int的大小。它可能因系统而异(例如,如果编译为32位系统,指针将是4字节,而在64位系统上它是8字节)。
如果任何malloc在for循环中失败,我是否应该释放那里的数组
您应该释放到目前为止分配的所有内容-每个array[0..(i-1)]
和array
本身。
malloc(sizeof(int *) * mem_size)
为mem_size
指针数组分配内存
malloc(sizeof(int) * 2);
为2个int型分配内存。
你也应该考虑分配普通的1D数组,当你想要访问它时,只计算索引。
sizeof(int)
= 4 bytes
sizeof(int *)
也等于4字节
…因为指针只保存4个字节。
当你调用malloc(int)
和malloc(int *)
——在这两种情况下,内存管理器在堆上分配4个字节,并返回一个指向分配内存的指针。
由于要将该地址存储到数组中(该数组是双指针,因此只能保存另一个指针的地址),因此以下操作是非法的:
array = malloc(sizeof(int *) * mem_size);
——使用
你可以通过以下方式实现你想要的:int *ptr = NULL;
int **p_ptr = NULL;
ptr=(int *)malloc(sizeof(int *));
p_ptr = &ptr;
**p_ptr = 100
或任何其他值;现在,您所做的任何更改都将反映在分配的4字节
它们中的每一个都是根据您的平台中的不同特性确定的。
int
的大小是由编译器决定的,通常是为特定的处理器指定的。
所以它实际上是从CPU体系结构派生出来的。
通常是4个字节,但在某些平台上可能是2个字节。
int*
(或任何其他指针)的大小由虚拟内存地址空间的大小决定。
因此它有效地派生自MMU架构。
在32位系统上是4个字节,在64位系统上是8个字节。