需要使用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允许这种类型的自动转换,因此不包含转换为整型指针是安全的。 我无法破译究竟是什么被喂入malloc函数,虽然(以及为什么)。 看起来我们正在获得ptr的解除引用值的大小。 但是这不是NULL吗? 所以NULL的大小是0,对吧? 为什么我们乘以10?

3)最后一行与上面相同,只是明确声明了一个强制转换。 (从void指针转换为int指针)。


我假设我们在这里谈论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倍于单个整数的大小; 调用的返回值是指向该内存的指针。


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

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

第三行就像第二行,但有两个变化:它显式将void * return从malloc()转换为int * ,以匹配ptr的类型; 它使用int类型的sizeof而不是该类型的表达式,如*ptr 。 明确的演员没有必要,有些人强烈反对使用它,但最终归结为偏好。

malloc() s ptr应该指向堆上的有效位置并且可以安全地取消引用之后,只要malloc成功。


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

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

链接地址: http://www.djcxy.com/p/28473.html

上一篇: Need assistance in understanding this code using malloc and pointers

下一篇: Does std::malloc return NULL or nullptr on failure