C malloc在函数中抛出内存错误

C malloc在函数中抛出内存错误,c,linux,malloc,C,Linux,Malloc,我的功能有问题 char *readFnName(char *fnString, int n, int offset, int *size) { char *fnName; int nameBuffer, i, j; i = offset; j = 0; nameBuffer = 8; fnName = (char *)malloc(nameBuffer); while(*(fnString + i) != '(' &&

我的功能有问题

char *readFnName(char *fnString, int n, int offset, int *size) {
    char *fnName;
    int nameBuffer, i, j;

    i = offset;
    j = 0;
    nameBuffer = 8;
    fnName = (char *)malloc(nameBuffer);

    while(*(fnString + i) != '(' && i<n) {
        *(fnName + j++) = *(fnString + i++);
        if (j>=nameBuffer) {
            nameBuffer += 8;
            fnName = (char *)realloc(fnName, nameBuffer);
        }
    }

    *(fnName + j++) = '\0';
    *size = j;

    return fnName;
}
我在netbeans调试器中收到一条消息:

malloc(): memory corruption: 0x08a62218

我使用netbeans和lubuntu。

您发布的代码没有问题。运行时错误消息表明程序早期可能存在堆损坏,稍后调用*alloc函数会显示此情况


试着在整个程序上运行valgrind,它可能会发现一些东西。否则,请仔细检查使用malloc缓冲区的代码,以确保不会溢出它们。您可能必须分而治之,才能找出程序的哪个部分存在问题

 fnName = (char *)realloc(fnName, nameBuffer);
realloc通过为您重新分配更多内存来扩展您的内存。如果您请求的额外内存不能在旧fnName内存所在的相同连续区域中提供,分配器将从内存中的另一个位置获取您的分配块。这意味着仍然指向旧fnName内存区域的所有指针(例如指向*fnName+N的另一个指针)仍然指向那里,即使分配器为fnName提供了一个新地址,以便您可以拥有所请求的所有内存。这些指针称为悬挂指针,因为它们指向程序不再拥有的已分配内存。这就是您收到内存损坏消息的原因。操作系统告诉您,您的程序试图访问它不拥有的内存。当您的程序使用这些悬空指针时会发生这种情况,就好像它们仍然指向分配的内存一样

realloc工作正常,除非您请求的内存超过分配器从当前地址连续提供的内存。如果它不能连续提供内存,它将从其他地方获取它并返回另一个内存地址给您

要解决这个问题,您必须重新分配所有仍然引用重新分配给新内存地址的旧内存的指针。因为您不能真正预测何时需要这样做,并且不想编写不必要的代码,并且由于C没有类,所以您应该考虑在程序开始时分配一个足够大的内存池。然后,您可以编写一个简单的分配/取消分配算法,允许您在函数期间从中获取内存。这样做将教会您更多关于分配连续内存的知识

请看下面修改过的函数: 包括 包括 使用名称空间std; char*readfnname char*fnString,int n,int offset,int*size{ char*fnName=NULL; int nameBuffer=8; int i=偏移量; int j=0; 整数计数=0; int fnNameIndex=0; //----------------------------既然你想复制所有的东西,但是想知道怎么做 //----------------------------长字符串不包含所有字符。 对于int k=0;k. @赛尔夫,如果你对这个建议有异议,也许可以在上面启动一个元线程,而不是垃圾评论。我不认为有500+是巧合upvotes@self.:关于不要发布malloc结果的建议与此问题相关。您的注释不正确。@DevMetal91,代码看起来正常,除了无法检查alloc函数是否返回NULL,以及可能无法包含stdlib.h之外。如果您仍然存在问题,那么问题可能存在于代码的其他地方,例如堆损坏,并且当您执行此操作时,它正好出现。或者,一个不太具煽动性的问题:尝试在整个程序上运行valgrind,它可能会出现一些问题。否则,请仔细检查使用malloc缓冲区的代码,以确保不会溢出它们。您可能必须分而治之,才能找出程序的哪个部分有问题。fnName=malloccount将把count字节数分配为空指针。这个例子需要一个字符指针。它还需要malloc来分配能够保存字符变量的内存。如果您的操作系统代表ch,那么使用malloccount将起作用
字符为1字节。最好的做法是将count乘以要分配的变量的大小。fnName=char*mallocsizeofchar*count;这样,如果此代码是在不同的操作系统上编译的,该操作系统将字符变量表示为2字节,那么代码将始终获取操作系统使用的字符大小2字节,并将其乘以计数。这样malloc将分配足够的内存。如果在本例中使用just count,当字符变量为2字节时,您的程序将没有足够的内存来保存所需的字符串,最终在您尝试处理该字符串时会出现内存访问冲突错误。我知道在本例中,您可以使用malloccount,但这不适用于计算整数数或结构类型数。您需要mallocsizeoffint*计数或mallocsizeofstruct*计数。因此,最好使用fnName=变量指针mallocsizeof variable type*变量计数。sizeof函数很方便,因为它可以查找变量类型的大小(以字节为单位)。这是您正在运行的操作系统用于该变量类型的大小(以字节为单位)。
 fnName = (char *)realloc(fnName, nameBuffer);
char* pool; if ((pool = malloc(sizeOfPoolInBytes)) == NULL) merror();