C新手并在Linux上运行程序时遇到错误,该程序在使用MinGW编译的Windows中运行良好
我获得双重免费或腐败(退出):运行程序时。
这里是我认为错误的地方:
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)
当我使用不正确的参数调用程序时,它不会导致错误。只有在我正确使用程序时才会出现错误
答案 0 :(得分:3)
您在gdb中看到的问题与正常运行程序时遇到的问题不同。
在gdb输出中,您可以看到argc=1
。这意味着argv只有一个元素,argv[1]
超出范围。
您可能在没有参数的情况下调用了该程序。请注意,当您在gdb下运行程序时,参数将在&#39; run&#39;之后提供。当你调用gdb本身时,gdb中的命令,不是。
我建议您添加一个检查,表明您已收到预期的参数数量,如果没有则显示错误消息。
至于双重免费或腐败&#39;,valgrind输出中的这些信息可能很重要:
==12431== Address 0xfff000250 is on thread 1's stack
这意味着您正在尝试释放局部变量而不是堆变量。也许您将错误的参数传递给TKDestroy?
答案 1 :(得分:0)
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]
。
要完成此操作,您需要在访问任何元素argc
之前检查argv[]
。