【问题标题】:Realloc results in an error (Heap block past requested size...) [duplicate]Realloc导致错误(堆块超过请求的大小......)[重复]
【发布时间】:2015-11-04 00:21:30
【问题描述】:

我正在尝试创建一个对动态字符串执行某些操作的程序。下一个方法应该将 myString 设置为空字符串。

每当我尝试使用字符串对结构进行 realloc() 时(就像在仅为演示目的添加的代码行中一样)它会导致错误:

0000000000541E80 处的堆块在 0000000000541E91 处修改,请求大小为 1。

导致问题的原因是什么?我几周前才开始学习 C,所以请不要使用高级术语。

struct _MyString
{
    char* myString;
};


MyString * myStringAlloc()
{
    MyString *newMyString = (MyString*) malloc(0);
    if(newMyString == NULL)
    {
        return NULL;
    }
    newMyString->myString = "";
    newMyString = (MyString*) realloc(newMyString, 4);
    //some more code
    return newMyString;
}

【问题讨论】:

  • 标准警告:不要像 malloc 和朋友返回的那样投射 void *。 C 不是 C++!
  • 这个问题不是重复的,因为问题不在于 char* 的 malloc(0) 问题,而是他未能为整个结构正确分配空间。还有一个问题,当他应该只重新分配指向 char* 成员的指针时,他正在为整个结构重新分配空间
  • @dbenson 据我所知,问题开始malloc(0) 返回一个非NULL 值和取消引用......
  • @SouravGhosh 我花时间输入了一个更完整的答案,我觉得实际上解决了 OP 对指针和分配的误解,而链接的帖子中没有提到。
  • @SouravGhosh 那么你有没有机会重新讨论这个问题?

标签: c dynamic char malloc realloc


【解决方案1】:

尝试使用:)

MyString *newMyString = (MyString*) malloc( sizeof( struct MyString ) );

而不是

MyString *newMyString = (MyString*) malloc(0);
                                          ^^^^

根据 C 标准(7.22.3 内存管理函数)

如果请求的空间大小为零,则行为是 实现定义:要么返回一个空指针,要么 行为就像大小是一些非零值,除了 返回的指针不得用于访问对象。

在您的代码 sn-p 中,程序两次尝试使用指针访问对象。第一次在这个声明中

newMyString->myString = "";

第二次在此声明中

newMyString = (MyString*) realloc(newMyString, 4);

尝试复制原始对象时。

【讨论】:

  • 可以更好地解决对OP的误解
  • 不要投void *
  • 我不相信你两次中的后者违反了标准动词年龄。该指针未用于访问任何对象。而是将指针的值发送到realloc,这应该是可以接受的,因为它满足realloc 的要求(该值应来自内存分配函数结果,或NULL)。如果不是这种情况,或者不清楚,它可能会成为一个有趣的问题。
  • newMyString = (MyString*) realloc(newMyString, 4); 的哪个位置有任何 member 被访问?我们可能在看两种不同的东西。我正在查看您发布的“此声明中的第二次”sn-p,它根本不引用 newMyString
  • 当原始大小请求为 0 时,我没有看到这样的副本发生。根据您提供的引用,malloc(0) 的返回是实现定义的(NULL 或其他)。在任何一种情况下,无论它是什么,那行代码都应该是有效的。如果值为 NULL,它肯定有效,我不相信当结果是实现定义的非 null 时它是无效的。没有任何论据,第一个 sn-p 是错误的(显然)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2013-05-27
  • 2021-09-10
相关资源
最近更新 更多