【问题标题】:Problems with realloc in C [duplicate]C中的realloc问题[重复]
【发布时间】:2014-08-29 19:03:30
【问题描述】:

我正在为重新分配而苦苦挣扎......

strucType mkBggr (structType x, char ch) { 
    x = realloc(x, 100);
    printf("%d", sizeof(x));
}

我认为这应该打印出值 100,但它打印出 8。

这显然与指针有关,但我不知道是什么。我在 x 前面添加了 *s 和 &s,但我似乎不明白。任何帮助表示赞赏!

【问题讨论】:

  • 请添加structType的定义。
  • 问题与realloc无关。删除对realloc 的调用,输出保持不变。问问自己x 是什么,sizeof 是什么意思。
  • 顺便说一句,在此代码中使用 realloc 的正确方法是:structType tmp = realloc(x, 100); if (tmp) { x = tmp; } else { /*...realloc failed, need to keep old value of x...*/ }
  • 这个问题已经在 SO 上被问过好几次了,我记得自己也回答过好几次了。
  • @hyde 失败总是返回 NULL, but realloc()/malloc()` 返回 NULL 并不总是表示失败。考虑何时size == 0

标签: c realloc


【解决方案1】:

Realloc 返回一个指针,所以 x 是指针类型。 sizeof(x) 返回一个指针的大小,在这个环境中是 8 个字节。

【讨论】:

    【解决方案2】:

    它会打印值 8,因为您要求的是指针 (x) 的大小。您无法打印分配的内存块的大小 - 您必须自己跟踪。

    这就是我不推荐使用 realloc 的原因;我看到的几乎所有询问它的人都在使用它。

    【讨论】:

    • 我想重新分配一块内存来改变大小但保留持久的内容。如果不是realloc,请推荐一种方法。
    • @DavidHerrnan:只需明确使用mallocmemcpyfree,在free 之前测试malloc 以防止失败。这比realloc 要好得多
    • @Basile Starynkevitch 请考虑在 codereview.stackexchange.com 或 SO 上发布malloc, memcpy, free 解决方案。
    • @BasileStarynkevitch 为什么明确使用这些更好?
    • 因为做事明确地处理失败的情况要好得多。一个天真的 ptr = realloc(ptr,size); 在失败时失去了 ptr....
    猜你喜欢
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 2013-04-21
    • 2015-07-20
    • 2010-11-07
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    相关资源
    最近更新 更多