malloc(sizeof(int))和malloc(sizeof(int *))之间有什么区别

时间:2014-06-23 10:15:17

标签: c arrays malloc multidimensional-array

我想为下面的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);

3 个答案:

答案 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个字节。