【问题标题】:Why can I assign a longer string to a pointer in C?为什么我可以将更长的字符串分配给 C 中的指针?
【发布时间】:2013-04-18 00:13:21
【问题描述】:
#include <stdio.h> 
#include <stdlib.h>

int main()
{
    char *ptr = malloc(sizeof(char) * 1);
    ptr = "Hello World";

    puts(ptr);
    getchar();
}

我不是 malloc() 专家,但由于我只分配了一个字节但为 *ptr 指针分配了一个包含 11 个字节的值,所以该代码不应该给出错误吗?
还是 H 是否存储在我分配的位置,然后字符串的其余部分就放在它之后的位置?

【问题讨论】:

  • 这不是您的代码,否则您会收到错误消息,因为(char *) ptr 不是左值。
  • 如果你真的写了ptr = "Hello World";,那就是指针赋值;它不会复制任何数组的内容。但是请更新您的问题以显示您实际编译的代码(复制并粘贴它,不要重新输入)。
  • 旁注; sizeof(char) 被定义为 1... 数学告诉我们任何乘以 1 的结果都是相同的值。那里有两个级别的冗余。只需使用malloc(1)

标签: c string pointers memory malloc


【解决方案1】:

您正在将指针“ptr”重新分配给另一块内存,因此您不会看到任何错误。但是,您分配的内存块(大小 1)“丢失”并导致内存泄漏。

【讨论】:

  • 是的,这是正确的。如果您想看到预期的错误,请尝试使用memcpy(ptr, "Hello World"),它将尝试将 11 个字节写入分配给 ptr 的内存。
  • @austin:那就是 UB。您不一定会收到错误消息。
【解决方案2】:

当使用malloc 时,您正在请求一些内存,malloc 返回该内存的第一个地址(如果可以给出)。当您重新分配指针时,您没有对它指向的内存做任何事情。您只需更改指针指向的 what

您在这里所做的在技术上是有效的 C 但是您正在创建内存泄漏,因为您丢失了 malloced 内存的地址,当您“重新完成它。

【讨论】:

    猜你喜欢
    • 2018-03-26
    • 1970-01-01
    • 2011-10-11
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多