C语言 malloc(sizeof(int))和malloc(sizeof(int*))的区别是什么?



我想为下面的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个字节。

相关内容

  • 没有找到相关文章

最新更新