c - 需要帮助理解我的示例的 malloc(0)

标签 c pointers memory malloc dynamic-memory-allocation

<分区>

我试图理解双指针(它是持有另一个指针的指针)的内部结构以形成一个指针数组。因此,我尝试通过在 malloc 上进行调试来尝试运行以下代码并查看其工作原理。我无法理解 malloc(0) 在我的情况下做了什么,但我的代码通过输出“Hello World”来工作。

有什么区别

pToCharsPointers = (char**) malloc(0);

pToCharsPointers = (char**) malloc(2 * sizeof(char*));

请有人澄清它在我的案例中做了什么。

#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;
}

此外,如果您能解释双指针如何使用内存中的示例进行可视化,我将不胜感激,因为即使我试图在很多地方阅读它,我也看不到自己。

编辑:感谢大家分享您的答案,这确实有助于理解。当我打印它时,我得到了一个有效的 malloc(0) 指针,并且在多次尝试期间也可以毫无问题地取消引用它。想了解其工作原理。似乎在我的案例中,未定义的行为实际上是预期的行为。

最佳答案

在你的代码中

(char**) malloc(0);

错误的原因有两个,比如

任何代码,如果试图将返回的指针用于像您这样的代码,本质上将取消引用调用 undefined behavior 的无效内存。 .因此,您的程序的输出/行为既无法预测也无法推理。

OTOH,像这样的声明

pToCharsPointers = malloc(2 * sizeof(char*));

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

关于c - 需要帮助理解我的示例的 malloc(0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42434589/

相关文章:

c++ - 在C中如何使用指针/数组来实现这些方法?

java - 使用 coldfusion 或 java 压缩文件的最有效方法

matlab - 与 R 中的类似方法相比,Matlab 中的 textscan 使用过多的 RAM

java - java中stringbuilder中Fortify的拒绝服务问题

c++ - 从集合中生成大小为 k 的所有子集

c - 错误 : invalid conversion from 'void (*)(...)' to 'void (*)()'

c - 尝试访问 C 中二维数组的地址并出现段错误

c++ - 在 C 中从 Rust 读取指针

c - 为什么这个程序没有显示任何错误?

c - 如何测量一小段 C/汇编代码的速度?