需要帮助使用malloc和指针来理解这段代码

时间:2011-10-11 02:23:00

标签: c pointers types malloc

以下是维基百科关于malloc()的文章的一小段代码:

    int *ptr;
    ptr = malloc(10 * sizeof (*ptr)); // Without a cast
    ptr = (int*)malloc(10 * sizeof (int)); // With a cast

我想知道是否有人可以帮我理解这里发生了什么。所以,从我所知道的 ,看来这就是发生的事情:

1)初始化一个指向NULL的整数指针。它是一个指针,因此它的大小是4个字节。取消引用此指针将返回值NULL。

2)由于C允许这种类型的自动转换,因此不包括转换为int-pointer的指针是安全的。我无法解读究竟正在为malloc函数提供什么(以及为什么)。看起来我们正在获得ptr的解除引用值的大小。但是这不是NULL吗?所以NULL的大小是0,对吗?为什么我们乘以10?

3)最后一行与上面的内容完全相同,只是显式声明了一个强制转换。 (从void指针强制转换为int指针)。

3 个答案:

答案 0 :(得分:4)

我假设我们在这里谈论C。对于C ++,答案是不同的。

1)完全关闭。 ptr是指向int的指针,这就是全部。它没有初始化,因此它没有确定性的价值。取消引用它是未定义的行为 - 你肯定不会得到0!指针也很可能指向0. ptr的大小为sizeof(ptr)sizeof(int*);没有其他的。 (充其量你知道这不比sizeof(void*)大。)

2/3)在C中,永远不会转换malloc的结果:int * p = malloc(sizeof(int) * 10);。代码为10个整数分配足够的内存,即单个整数大小的10倍;调用的返回值是指向该内存的指针。

答案 1 :(得分:1)

第一行声明一个指向整数的指针,但不初始化它 - 所以它指向一些随机的内存,可能是无效的。 ptr的大小是int的大小指针,可能是4或8个字节。它指向的大小,当它指向某个有效位置时,通过取消引用它得到的大小是int具有的大小。

第二行从堆中为10 int分配足够的内存,然后将其分配给ptr。不使用强制转换,但void *返回的malloc()会自动转换为分配时需要的任何类型的指针。 sizeof (*ptr)给出了解除引用 ptr的大小,即ptr指向的大小(int)。对于sizeofptr是否实际指向有效内存并不重要,只要类型是什么。

第三行与第二行类似,但有两处更改:它明确地将void *从[{1}}返回到malloc(),以匹配{{1}的类型};它使用类型名称为int *的{​​{1}}而不是ptr类型的表达式。明确的演员表是没有必要的,有些人强烈反对它的使用,但最终归结为偏好。

sizeof int中的任何一个应指向堆上的有效位置,并且只要*ptr成功,就可以安全取消引用。

答案 2 :(得分:0)

对于第2行 malloc()分配足够的内存来容纳10个指针。

malloc()是一个通用函数 void 所以它必须强制转换为您实际想要使用的任何类型,在上面的示例指针中指向int。