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

标签 c linux string gdb

C 语言新手,在 Linux 上运行我的程序时遇到错误,该程序在使用 MinGW 编译的 Windows 中运行良好

运行程序时,我得到双重释放或损坏(out)。

我认为错误的地方是:

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 传递了错误的参数?

关于c - 在C中查找 "double free or corruption (out):"的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39757748/

相关文章:

php - C 中的 OpenSSL "Seal"(或通过 shell)

将 C 字符串转换为 Pascal 字符串

linux - 使用 newfs 文件系统创建可挂载镜像

java - 使用正则表达式使用转义字符(可以自转义)分割消息

c# - 格式化字符串以显示自定义十进制值

c - 在 C 中获取 'atoi' 函数的警告

c - 如何在 Github 中为 Makefiles 保留标签

python - Cloudflare API 将代理参数默认为 false

c++ - LLVM万花筒教程JIT编译问题

java - 从文本文件中读取一大行字符串