C Valgrind:大小为1的读取无效
我对valgrind有意见: 这是我的程序(错误出现的主要部分): 当我运行valgrind时,它说:C Valgrind:大小为1的读取无效,c,pointers,valgrind,C,Pointers,Valgrind,我对valgrind有意见: 这是我的程序(错误出现的主要部分): 当我运行valgrind时,它说: 我不知道这个程序出了什么问题。当没有更多令牌时,strtok有可能返回NULL 当您将NULL传递给strcmp时,这是一个未定义的行为,因为您在那里取消引用NULL。如何阅读: 大小为1的读取无效 您的程序正在尝试从Valgrind不喜欢的地方读取一个字节 在0x401569:main(:395) 代码中发生这种情况的地方(显然strcmp已经内联) 地址0x0不是堆栈malloc'd或(最
我不知道这个程序出了什么问题。当没有更多令牌时,
strtok
有可能返回NULL
当您将NULL传递给strcmp时,这是一个未定义的行为,因为您在那里取消引用NULL。如何阅读:
大小为1的读取无效
您的程序正在尝试从Valgrind不喜欢的地方读取一个字节
在0x401569:main(:395)
代码中发生这种情况的地方(显然strcmp已经内联)
地址0x0不是堆栈malloc'd或(最近)free'd
它读取的地址-0x0为“空”。语句的其余部分只是说明了它无效的原因(它不是从堆栈中获得的,也不是从malloc获得的,而且最近也没有被释放)。之所以提到“最近”,是因为valgrind跟踪有限数量的释放内存,所以它不能肯定一百万次释放后它没有被释放——在本例中不是,但是如果你看到这样的消息,它可能是因为它在很久以前被释放而变得无效。地址将不是零(或接近零) 检查
p
在strtok
之后是否为NULL
。最好在调试器下运行程序,以确定它们做错了什么。这里不需要调试器,valgrind准确地说明了这里发生了什么@用户1934103,请阅读它告诉您的内容。在它所指示的位置,什么地址可以是0x0
?所以它告诉你p
是0
。
int main()
{
char comanda[N];
....
char *p;
while( fgets(comanda,100,stdin)!=NULL)
{
p=strtok(comanda," \n");
if (strcmp(comanda,"INIT")==0)
{
p=strtok(NULL," ");
Init(n);
}
395 >>if (strcmp(p,"DUMP")==0)
{
Dump(n);}
if (strcmp(p,"ALLOC")==0)
{
Alloc(j,n);
}
....return 0;}
Invalid read of size 1
at 0x401569: main (:395)
Address 0x0 is not stack'd malloc'd or (recently) free'd