【问题标题】:Malloc memory for C string inside a structure结构内 C 字符串的 Malloc 内存
【发布时间】:2011-12-06 18:32:54
【问题描述】:

我目前有以下代码。

    struct qnode
    {
        char *path;
        struct qnode *next;
    }

    typedef struct qnode Node;

此时我的代码失败了,但是当我尝试在 struct qnode 中为 for 分配空间时。

void add(Node *front, Node *back,char **path)
{
    /* Create the new node */
    Node *cur = (Node *)malloc(sizeof(Node));

    /* Verify node successfully created */
    if(cur)
    {
            /* Populate Members of Node */
            cur->path = malloc(strlen(*path)); /* fails here */
            printf("Malloc path success");
            cur->path = *path;

我已经验证 strlen 确实在正确的指针上运行,并且它确实返回了大小的长度。出于某种原因,尽管此时我遇到了分段错误,但我不明白为什么。

F.y.i 这是分配的一部分但是这个简单的 malloc 行不是专门分配的东西,也不是使用 C 语言。我被允许在作业中使用 C++,但我选择了 C 以获得更多关于该语言的知识。

感谢您的帮助!

【问题讨论】:

  • path的类型是什么?为什么要丢弃第二个malloc 返回的指针?

标签: c struct char malloc pointers


【解决方案1】:

您没有分配足够的内存。您需要为零终止符留出空间。您还必须复制字符串的内容,而不是将指针分配给字符串。这两个错误都会导致堆损坏,并会解释您的错误。代码应该是这样的:

cur->path = malloc(strlen(*path)+1);
printf("Malloc path success");
strcpy(cur->path, *path);

如果您的系统可用,您当然可以使用strdup,但请注意它不是标准 C 的一部分。

【讨论】:

  • 感谢您的帮助。我意识到我错过了 strcpy 部分,但忘了进去改变它。我的错误实际上是一个简单的小错误,但是如果您注意到我的“临时”调试语句并不完全有帮助,因为我忘记包含一个 \n 来刷新输出缓冲区,因此消息实际上会在正确的时间打印。不过感谢您的帮助!而且我不知道 strdup,我只是验证它在我的系统上,这让事情变得更容易一些。同样, strlen(*path) 返回的值确实是包括 '\0' 在内的实际大小,正如我刚刚调查过的那样。
  • 本,你需要调查你的调查。 strlen 绝对不应该计算终止的 '\0'。
  • @Ben Nigel 是正确的。 strlen 不计算任何 \0 字符。你一定搞错了。
猜你喜欢
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
相关资源
最近更新 更多