【问题标题】:Weird error while using realloc [closed]使用 realloc 时出现奇怪的错误 [关闭]
【发布时间】:2016-08-20 14:11:02
【问题描述】:

我在下面的代码中运行,我得到的输出是 8 0 4,而不是 8 9 4。你能帮我理解这段代码的问题吗?

#include <cstdlib>
#include <iostream>

using namespace std;

int main() { 
    int *p;

    p = (int*)calloc(2, sizeof(int));

    *(p + 0) = 8;
    *(p + 1) = 9;

    p = (int*)realloc(p, 3);

    *(p + 2) = 4;

    for (int i = 0; i < 3; i++)
        cout << p[i] << " ";

    free(p);
    p = NULL;
}

【问题讨论】:

  • realloc(p,3) --> realloc(p,3*sizeof(int))
  • 1) 格式化这个烂摊子! 2)不要垃圾邮件标签。这是 C++,而不是 C。 3) 未定义的行为。实时调频! 4) 不要在 C++ 中使用 C 风格的内存分配。不要在 C++ 中使用 C 风格的编码。如果你想要 C,就写 C 代码! 5) 使用数组表示法,而不是指针算术。不要混淆你的代码。
  • @Olaf:我同意 100%。顺便说一句,realloc() 的 C++ 等价物是什么?
  • @chqrlie:我不会用 C++ 编程。但是标准库应该提供一些东西。
  • @chqrlie std::vector&lt;int&gt;::resize()

标签: c++ realloc


【解决方案1】:

The realloc function 需要 bytes 而不是元素的大小。

你需要做的

int *temp = realloc(p, 3 * sizeof(*temp));
if (temp == NULL)
{
    // Handle error...
}
p = temp;

请注意,我对realloc 的结果使用了一个临时变量。这是因为如果 realloc 失败,它将返回 NULL 并将结果重新分配给您作为第一个参数传递的指针,那么您将丢失原始指针。

【讨论】:

    【解决方案2】:

    作为realloc() 的参数指定的大小必须以字节数计算。正如您自己发现的那样,简单的解决方法是

    p = (int*)realloc(p, 3 * sizeof(int));
    

    顺便说一句,您可以使用 *p 的类型而不是 int 以避免在 p 的类型稍后更改时可能出现的不一致:

    p = (int*)realloc(p, 3 * sizeof(*p));
    

    但由于 C++ 中需要强制转换,因此至少可以看到不一致。 您还应该测试calloc()realloc() 是否成功。它们不会抛出异常,而是在内存不足时返回 NULL

    请注意,您应该决定是用 C 还是 C++ 编程。这些语言有共同的祖先,但有​​明显的分歧,在一种语言中使用的一些习语在另一种语言中被认为是不好的风格,因为有更合适和更安全的结构可用。

    这是您的 C 程序的更正版本:

    #include <assert.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) { 
        int *p = calloc(2, sizeof(*p));
        assert(p != NULL);
    
        *(p + 0) = 8;
        *(p + 1) = 9;
    
        p = realloc(p, 3 * sizeof(*p));
        assert(p != NULL);
    
        *(p + 2) = 4;
    
        for (int i = 0; i < 3; i++) {
            printf("%d ", p[i]);
        }
        putchar('\n');
        free(p);
        return 0;
    }
    

    虽然这里是 PaulMcKenzie 的 C++ 程序,它实现了相同的功能,但仍然不赞成使用指针 p

    #include <vector>
    #include <iostream>
    
    using namespace std;
    
    int main() { 
        std::vector<int> pV(2);
        int *p = pV.data();
        *(p + 0) = 8;
        *(p + 1) = 9;
        pV.resize(3);
        p = pV.data();
        *(p + 2) = 4;
        for (int i = 0; i < 3; i++) {
            cout << p[i] << " ";
        }
    }
    

    如您所见,std::vector&lt;int&gt;::resize() 获取元素的数量,无需计算字节数。

    在 C++ 中使用指针,尤其是指针算术并不是很好的做法,一个更简单的版本是:

    #include <vector>
    #include <iostream>
    
    using namespace std;
    
    int main() { 
        std::vector<int> v(2);
        v[0] = 8;
        v[1] = 9;
        v.resize(3);
        v[2] = 4;
        for (int i = 0; i < 3; i++) {
            cout << v[i] << " ";
        }
    }
    

    您也可以使用枚举器来打印输出。

    【讨论】:

      【解决方案3】:

      好的,我明白了:

      p = (int*)realloc(p, 3);
      

      我指定的大小值是3,应该是3 * sizeof(int)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-28
        • 2020-08-30
        • 2013-05-05
        • 2011-02-09
        • 1970-01-01
        • 2011-08-25
        • 2012-05-05
        相关资源
        最近更新 更多