我想为下面的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);
答案 0 :(得分:2)
它只是一个编译时常量 - 第一种情况下指针的大小,第二种情况下的int大小。它可能因系统而异(例如,如果编译32位系统,指针将是4个字节,而在64位系统上则是8个字节)。
如果for循环中的任何malloc失败,我应该在那里释放数组
你应该释放到目前为止已分配的所有内容 - 每个array[0..(i-1)]
和array
本身。
malloc(sizeof(int *) * mem_size)
为mem_size
指针数组分配内存。
malloc(sizeof(int) * 2);
将内存分配2个整数。
此外,您应该考虑分配普通的1D数组,并在您想要访问时只计算索引。
答案 1 :(得分:0)
sizeof(int)
等于4个字节
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字节的分配大小
答案 2 :(得分:0)
每个人都是根据平台内的不同特征确定的。
int
的大小由编译器决定,编译器通常为特定处理器指定。
因此它实际上来自CPU架构。
通常是4个字节,但在某些平台上可能是2个字节。
int*
(或任何其他指针)的大小由虚拟内存地址空间的大小决定。
因此它实际上来自MMU架构。
在32位系统上是4个字节,在64位系统上是8个字节。