Realloc 导致错误(堆块超过请求的大小...)
Realloc results in an error (Heap block past requested size...)
我正在尝试创建一个对动态字符串执行某些操作的程序。下一个方法应该将 myString 设置为空字符串。
每当我尝试使用字符串重新分配()结构时(就像在仅为演示目的添加的代码行中一样)它会导致错误:
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;
}
尝试使用:)
MyString *newMyString = (MyString*) malloc( sizeof( struct MyString ) );
而不是
MyString *newMyString = (MyString*) malloc(0);
^^^^
根据 C 标准(7.22.3 内存管理函数)
If the size of the space requested is zero, the behavior is
implementation-defined: either a null pointer is returned, or the
behavior is as if the size were some nonzero value, except that the
returned pointer shall not be used to access an object.
在您的代码片段中,程序两次尝试使用指针访问对象。第一次在这个声明中
newMyString->myString = "";
和本声明中的第二次
newMyString = (MyString*) realloc(newMyString, 4);
当尝试复制原始对象时。
我正在尝试创建一个对动态字符串执行某些操作的程序。下一个方法应该将 myString 设置为空字符串。
每当我尝试使用字符串重新分配()结构时(就像在仅为演示目的添加的代码行中一样)它会导致错误:
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;
}
尝试使用:)
MyString *newMyString = (MyString*) malloc( sizeof( struct MyString ) );
而不是
MyString *newMyString = (MyString*) malloc(0);
^^^^
根据 C 标准(7.22.3 内存管理函数)
If the size of the space requested is zero, the behavior is implementation-defined: either a null pointer is returned, or the behavior is as if the size were some nonzero value, except that the returned pointer shall not be used to access an object.
在您的代码片段中,程序两次尝试使用指针访问对象。第一次在这个声明中
newMyString->myString = "";
和本声明中的第二次
newMyString = (MyString*) realloc(newMyString, 4);
当尝试复制原始对象时。