C Valgrind:大小为1的读取无效

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或(最

我对valgrind有意见: 这是我的程序(错误出现的主要部分):

当我运行valgrind时,它说:


我不知道这个程序出了什么问题。

当没有更多令牌时,
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