我一直收到大小为1的无效读取的valgrind错误,我无法确定原因.
是什么导致错误?
==24647== Invalid read of size 1
==24647== at 0x40258EA: strcpy (mc_replace_strmem.c:437)
==24647== by 0x8048606: main (source.c:26)
==24647== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==24647==
==24647==
==24647== Process terminating with default action of signal 11 (SIGSEGV)
==24647== Access not within mapped region at address 0x0
==24647== at 0x40258EA: strcpy (mc_replace_strmem.c:437)
==24647== by 0x8048606: main (source.c:26)
==24647== If you believe this happened as a result of a stack
==24647== overflow in your program's main thread (unlikely but
==24647== possible), you can try to increase the size of the
==24647== main thread stack using the --main-stacksize= flag.
==24647== The main thread stack size used in this run was 16777216.
Run Code Online (Sandbox Code Playgroud)
这是我下面的代码,我评论了检测到错误的行(source.c:26).
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>
int main()
{
char input[100];
char name[100];
char age[100];
int agee[100];
fgets(input,sizeof(input),stdin); //i scan in the string and store int char array called input.
char *charpoint;//declare pointer character
charpoint=strtok(input,"\"");//run strtoken with quotation marks as second part of argument.
strcpy(name,charpoint);
char * charpoint2=strtok(NULL,"\",");
strcpy(age,charpoint2); //This line is where the error occurs. line 26
sscanf(age,"%d",&agee[0]);
printf("%s %d",name, agee[0]);
system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
从手册页(强调我的):
在用NUL字符替换标记本身之后,strtok()和strtok_r()函数返回指向字符串中每个后续标记开头的指针. 当不再有令牌时,返回空指针.
从你的错误
==24647== Address 0x0 is not stack'd, malloc'd or (recently) free'd
Run Code Online (Sandbox Code Playgroud)
所以你的指针charpoint2是NULL,这意味着你之前的strtok调用没有找到你所期望的.您应检查该可能性并打印有关输入格式的错误.当然,您应该验证您的strtok通话是否符合您的意图.