gpt4 book ai didi

c - 这段代码中使用 malloc 和不使用 malloc 有什么区别?

转载 作者:行者123 更新时间:2023-11-30 18:31:57 24 4
gpt4 key购买 nike

正如一些人所说,这个 block 并不像我想象的那样。我试图分配内存块,然后在其中存储字符串文字 - 但现在再次查看它后,很明显这不是我在这里所做的。

如果您这样做有什么区别:

    char* memory = malloc(sizeof("String"));
memory = "String"; //edit: memory leaked
printf("%s", memory);
free(memory); //edit

或者这个:

    char* noMemory = "String";
printf("%s", noMemory);

最佳答案

在您的特定示例中,您正在泄漏内存并最终因尝试释放常量字符串 "string" 而导致未定义的行为,因为您首先分配内存,然后用“string”的地址分配给它,因此失去了原始分配的轨迹。

您需要使用strcpy(memory, "String");来复制字符串。

现在,除此之外,除非您只是这样做,否则您会浪费大量时钟周期,因为 mallocfree 不是自由操作,它们需要时间,当然,复制字符串也需要一些操作。最重要的是,用 malloc 分配的内存将比实际字符串占用更多的空间,这都是因为 mallocfree 函数需要一个内存块“旁边”的信息位能够完成其工作,并且因为通常大小会四舍五入到某个“好的”大小,例如8、16 或 32 字节。这意味着您不仅浪费了调用 malloc 和 free 的时钟周期,而且还使用了比实际要求的更多的内存。因此,您可能使用 40 或 64 字节,而不是 7 字节。

另一方面,如果你想修改字符串,那么你不能只使用现有的内存“String”,因为这不能保证是“可写”内存,同样,您最终会遇到未定义的行为(这可能意味着在任何现代操作系统上都会崩溃)。然而,还有其他几种可能的解决方案,例如:

 char local[15] = "String";

将为堆栈上的字符串提供 15 个字节的空间 - 空间量没有开销[最多 7 个字节],我们可以忽略在堆栈上分配它的开销堆栈,因为它是一条指令,如果您完全使用局部变量,则必须存在该指令 - 而且它是所有局部变量一起使用的一条指令。

此解决方案允许修改字符串(例如 strcat(local, "abc"); 来生成 "string abc"。只需确保您知道您要做什么正在做的事情,并且不要覆盖允许空格的末尾[并且不要忘记计算字符串末尾的零]。

关于c - 这段代码中使用 malloc 和不使用 malloc 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18303422/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com