在我的例子中需要帮助来理解malloc(0)

Din*_*h G 5 c memory malloc pointers dynamic-memory-allocation

我试图理解双指针(这是指针持有另一个指针)的内部形成一个指针数组.所以,我试图运行以下代码,通过试验malloc进行调试,看看它是如何工作的.我无法理解malloc(0)我的情况,但我的代码通过输出"Hello World"来工作.

什么是差异

pToCharsPointers = (char**) malloc(0);
Run Code Online (Sandbox Code Playgroud)

pToCharsPointers = (char**) malloc(2 * sizeof(char*));
Run Code Online (Sandbox Code Playgroud)

请有人澄清一下我的情况.

#include <stdio.h>

char **pToCharsPointers;

int main(void)
{
    pToCharsPointers = (char**) malloc(0);

    char* pToChars = "Hello";
    *pToCharsPointers = pToChars;

    *(pToCharsPointers + 1)= "World";

    printf("%s %s\n", *(pToCharsPointers + 0), *(pToCharsPointers + 1));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

另外,如果有人能解释双指针如何与内存中的示例一起工作以进行可视化,我会非常感激,因为即使我试图在很多地方阅读此内容,我仍未能看到自己.

编辑:感谢大家分享您的答案,这真的有助于理解.当我打印它时,我得到了一个带有malloc(0)的有效指针,并且在多次尝试期间也可以解除引用它而没有问题.想了解它的工作原理.在我的情况下似乎未定义的行为实际上是预期的行为.

Sou*_*osh 6

在你的代码中

(char**) malloc(0);
Run Code Online (Sandbox Code Playgroud)

有两个原因是错的,比如

尝试将返回的指针用于像您这样的代码的任何代码实际上将取消引用无效内存,从而调用未定义的行为.因此,程序的输出/行为既无法预测也无法推理.

OTOH,一个声明就好

pToCharsPointers = malloc(2 * sizeof(char*));
Run Code Online (Sandbox Code Playgroud)

是有效的,但你应该检查返回指针的有效性,以确保malloc()成功.

  • @DineshG***看似***工作正常是未定义行为的可能性之一. (2认同)