在 C 语言中查找" double free or corruption (out):"的原因



刚接触C,在Linux上运行程序时出现错误,该程序在使用MinGW 编译的窗口中运行良好

当运行程序时,我会得到双倍的自由或损坏。

这是我认为错误的地方:

TokenizerT *TKCreate( char * ts ) {
if(ts==NULL){
    return NULL;
}
char * tempstr;
tempstr = ts;
//Allocating memory for Tokenizer struct
TokenizerT *Tokenizer= (TokenizerT *) malloc(sizeof(TokenizerT));

//Allocating memory for token stream
Tokenizer->string = strdup(tempstr);

//strcpy(Tokenizer->string, ts);
//Check field to see wether or not strtok has went through its original call
Tokenizer->stepped = 0;

    return Tokenizer;
}

我还有一个简单的函数,它总是在windows中工作,但在Linux中返回错误的输出:

int isOctal(const char * str){
const char *curr = str;
int hasValue = 0;
//Checking if token begins with 0
if(*curr!='0'){
    return 0;
}
++curr;
//Ensuring 0-7 are only other digits used
while(*curr!=0){
    if ((*curr >='0')&&(*curr<='7')){
        ++curr;
    }else{
        return 0;
    }
    if(*curr>'0'){
        hasValue = 1;
    }
}
if(hasValue==0){
    return 0;
}
return 1;
}

这是我在使用gdb:时得到的

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400ca5 in main (argc=1, argv=0x7fffffffe378) at tokenizer.c:365
365             yoken = * TKCreate(argv[1]);

我真的很头疼,以为我终于解决了所有的问题,直到我尝试在Linux 上编译

编辑1:添加了对正确数量的参数的检查,它仍然会给出错误。如果我注释掉对这个函数的调用,代码可以工作,但我担心它不会释放内存。

void TKDestroy( TokenizerT * tk ) {
free(tk->string);
free(tk);

}

编辑2:以下是来自valgrind 的一些信息

==12431== Invalid free() / delete / delete[] / realloc()
==12431==    at 0x4C2AD17: free (in /usr/lib64/valgrind/vgpreload_memcheck- amd64-linux.so)
==12431==    by 0x400837: TKDestroy (tokenizer.c:76)
==12431==    by 0x400E11: main (tokenizer.c:403)
==12431==  Address 0xfff000250 is on thread 1's stack
==12431==  in frame #2, created by main (tokenizer.c:355)

当我用不正确的参数量调用程序时,不会导致错误。只有当我正确使用程序时才会出现错误

您在gdb中看到的问题与正常运行程序时看到的问题不同。

在gdb输出中,您可以看到argc=1。这意味着argv只有一个元素,并且argv[1]超出了界限。

您可能在没有参数的情况下调用了该程序。请注意,当您在gdb下运行程序时,参数是在gdb内的"run"命令之后提供的,当您调用gdb本身时,而不是

我建议您添加一个检查,检查您是否收到了预期数量的参数,如果没有,则显示一条错误消息。

至于"双重自由或腐败",valgrind输出中的这些信息可能很重要:

==12431==  Address 0xfff000250 is on thread 1's stack

这意味着您正在尝试释放一个局部变量,而不是堆变量。也许你把错误的论点传给了TKDestroy?

int main(int argc, char * argv[])
{
if(argc<2)
{
   printf("Usage : < command line execution format>n");
   return 0;
}
//your code
return 0;
}

如果argc = 1意味着命令行参数是1,即执行的文件。argv[0]包含执行的文件的文件名。如果您尝试访问没有分配任何内存的argv[1],则会导致分段故障。

要解决此问题,您需要在访问任何元素argv[]之前检查argc

最新更新