代码在我调用 "atoi" 函数后导致段错误
the code causes a segfault after I called "atoi" function
我创建了一个函数来解析类似于 "NAME:Sebastion | AGE:4 | DATE:8/2/2005" 的字符串,我试图获取年份“2005”。我写了一个函数如下。当我调用 "atoi" 时,该行出现段错误。 valgrind 告诉我
Invalid read of size 1
==25142== at 0x5171167: ____strtol_l_internal (strtol_l.c:298)
==25142== by 0x516DB6F: atoi (atoi.c:27)
==25142== by 0x400AB4: inYear (prelab8.c:115)
==25142== by 0x40094E: main (prelab8.c:46)
==25142== Address 0x0 is not stack'd, malloc'd or (recently) free'd
int inYear(char* string)
{
char* word;
word= strtok(string, "|");
word= strtok(NULL,"|");
word= strtok(NULL,"|");
char * new;
new = strtok(word,":");
new= strtok(NULL,"/");
new= strtok(NULL,"/");
new= strtok(NULL,"/");
//printf("%s\n",new);
int year;
year= atoi(new); // segfault
//printf("%d\n",year);
if(year!=2005)
return 0;
return 1;
}
您传递给此函数的字符串与预期的不匹配。通过不检查 strtok
是否返回 NULL
,您没有考虑到这种可能性并最终将 NULL
指针传递给 atoi
,导致程序崩溃。
在 每次 调用 strtok
之后,检查它是否 returns NULL
如果是则处理错误。
此外,不要使用 C++ 关键字,例如 new
作为 C 中的变量或函数名称。它可能会使 reader 混淆,如果您尝试从 C 转换,将会导致问题到 C++。
我创建了一个函数来解析类似于 "NAME:Sebastion | AGE:4 | DATE:8/2/2005" 的字符串,我试图获取年份“2005”。我写了一个函数如下。当我调用 "atoi" 时,该行出现段错误。 valgrind 告诉我
Invalid read of size 1
==25142== at 0x5171167: ____strtol_l_internal (strtol_l.c:298)
==25142== by 0x516DB6F: atoi (atoi.c:27)
==25142== by 0x400AB4: inYear (prelab8.c:115)
==25142== by 0x40094E: main (prelab8.c:46)
==25142== Address 0x0 is not stack'd, malloc'd or (recently) free'd
int inYear(char* string)
{
char* word;
word= strtok(string, "|");
word= strtok(NULL,"|");
word= strtok(NULL,"|");
char * new;
new = strtok(word,":");
new= strtok(NULL,"/");
new= strtok(NULL,"/");
new= strtok(NULL,"/");
//printf("%s\n",new);
int year;
year= atoi(new); // segfault
//printf("%d\n",year);
if(year!=2005)
return 0;
return 1;
}
您传递给此函数的字符串与预期的不匹配。通过不检查 strtok
是否返回 NULL
,您没有考虑到这种可能性并最终将 NULL
指针传递给 atoi
,导致程序崩溃。
在 每次 调用 strtok
之后,检查它是否 returns NULL
如果是则处理错误。
此外,不要使用 C++ 关键字,例如 new
作为 C 中的变量或函数名称。它可能会使 reader 混淆,如果您尝试从 C 转换,将会导致问题到 C++。