Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 字符数组的malloc内存导致访问冲突_C++_Malloc_Free_Marmalade - Fatal编程技术网

C++ 字符数组的malloc内存导致访问冲突

C++ 字符数组的malloc内存导致访问冲突,c++,malloc,free,marmalade,C++,Malloc,Free,Marmalade,这可能是一个很难回答的问题。我正在使用果酱SDK。如果我动态地为一个字符数组分配一些内存,我会得到一个访问冲突。我不知道我做错了什么。 这是使用malloc和free的有效方法吗 const char* CClass::caption(int something) { ... //char stringPrediction[2000]; // <--- This works size_t string01_Size = strlen(string01);

这可能是一个很难回答的问题。我正在使用果酱SDK。如果我动态地为一个字符数组分配一些内存,我会得到一个访问冲突。我不知道我做错了什么。 这是使用malloc和free的有效方法吗

const char* CClass::caption(int something)
{
    ...

    //char stringPrediction[2000]; // <--- This works

    size_t string01_Size = strlen(string01);
    size_t string02_Size = strlen(string02);

    ...

    stringX = (char *)malloc(string01_Size + string02_Size + 1); // <- Access violation

    strcpy(stringX , string01);
    strcat(stringX , " ");
    strcat(stringX , string02);

    return stringX ;
 }
然后,我使用它设置按钮单击事件上标签的标题

... OnClick...(...)
{
    CClass someObject;
    label.setCaption(someObject.caption());
}
点击几下后,我就得到了访问冲突

Unhandled exception at 0x1007ECB8 (s3e_simulator_debug.dll) in 
s3e_simulator_debug.exe:    0xC0000005: Access violation writing
location 0x0000000C.
编辑:问题似乎是:

  stringX = (char *)malloc(string01_Size + string02_Size + 1);
我未能为此分配空间:

  strcat(stringX , " ");
这应该更好:

  stringX = (char *)malloc(string01_Size + 1 + string02_Size + 1);
一,。 你不是在测试malloc失败的情况。该错误表明您正在尝试取消引用空指针—malloc失败时返回的指针

二,。 在计算缓冲区大小时,您似乎没有考虑空字节终止符。假设
string01\u Size
string02\u Size
是不包括空字节的字符数,则缓冲区溢出


这两个操作都会导致未定义的行为。

在调用malloc或free期间遇到的访问冲突在大多数情况下表示堆已损坏。由于,最常见的是在悬空指针上发出的溢出或双自由或自由,发生在早些时候。可能要早得多

从发布的代码中无法推断,因为它实际上是从崩溃开始的

为了解决这个问题,你可以尝试valgrind,AppVerifier,以及其他帮助解决腐败问题的运行时工具。对于一个特殊的问题——对于一般来说,您首先不应该在那里,使用malloc、str*函数和从C继承的所有垃圾


一致使用集合类、字符串类等可以防止过多的情况导致严重的问题。

您基本上已经发现了问题:如果不为第二个strcat分配空间,那么它将溢出,并且可能会压缩下一个块的堆指针。需要注意的其他事项(您可能正在这样做)是在重新分配之前释放CClass::caption()中的stringX,这样您就不会泄漏。无论什么,您都应该在使用之前检查malloc是否失败


正如其他人所建议的,使用std::string可能更好。如果需要,您始终可以将其转换为char*。当然,如果你这样做了,你应该考虑到异常会被抛出并相应地编程。

不相关(或者是?)<代码> STD::String < /C> >有什么不对吗?你能告诉我们String 01IsString + String 02Syth+ 1的结果吗?String 01和String 02?在C++中是100%合法的。@ RjRAJ,虽然问题措辞不好,但是显然它不是代码> > MalCube()/Script本身。如果
string01_Size
string02_Size
有效,则在第二次调用
struccat
时,可能会超出数组
stringX
,因为串联字符串之间有额外的空间。
  stringX = (char *)malloc(string01_Size + 1 + string02_Size + 1);