C 一个整数无缘无故地改变了自己,这可能是因为内存问题吗?
我有一个长程序,里面有一个int max。它不起作用,我发现max无缘无故地将自己更改为0,因为它的第一个值从未更改 我使用了大量的指纹来找出它发生的地方,出于某种原因发生在这里:C 一个整数无缘无故地改变了自己,这可能是因为内存问题吗?,c,variables,int,C,Variables,Int,我有一个长程序,里面有一个int max。它不起作用,我发现max无缘无故地将自己更改为0,因为它的第一个值从未更改 我使用了大量的指纹来找出它发生的地方,出于某种原因发生在这里: printf("max is: %d\n",max); qtail->block=0; printf("max is: %d\n",max); 在此指令之前,max有其正确的值,之后,max为0。怎样??该指针与max完全无关,可能我耗尽了堆栈内存,程序开始重写自身?…block也是int,但在结构内部,问
printf("max is: %d\n",max);
qtail->block=0;
printf("max is: %d\n",max);
在此指令之前,max有其正确的值,之后,max为0。怎样??该指针与max完全无关,可能我耗尽了堆栈内存,程序开始重写自身?…block也是int,但在结构内部,问题是由于未定义的行为而发生的;利用
printf("%p : %p", &(qtail->block), &max);
我看到max和qtail指针具有相同的地址,并更正了导致它的原因 问题的发生是由于未定义的行为;利用
printf("%p : %p", &(qtail->block), &max);
我看到max和qtail指针具有相同的地址,并更正了导致它的原因 您很可能会调用未定义的行为,但我们需要一个适当的命令来告诉您哪里(很可能是
qtail
未初始化,或者是一个空指针)“可能我耗尽了堆栈内存,程序开始重写自身?”-在任何现代操作系统上都没有。似乎qtail->block
与max
@PaulOgilvie的地址相同,或者它与max
部分重叠,因此将其归零会将max
的所有非零部分归零。请尝试printf(%p:%p,&(qtail->block),&max)
查看它们是否可能指向同一地址。您很可能调用未定义的行为,但我们需要一个适当的命令来告诉您哪里(很可能qtail
未初始化或空指针)“可能我耗尽了堆栈内存,程序开始重写自身?”-在任何现代操作系统上都没有。似乎qtail->block
与max
@PaulOgilvie的地址相同,或者它与max
部分重叠,因此将其归零会将max
的所有非零部分归零。请尝试printf(%p:%p,&(qtail->block),&max)
查看它们是否可能指向相同的地址。如果qtail->block
的类型为int
和&qtail->block=&max
,则您观察到的行为是完全明确的,并且完全符合预期。这两个指针的别名可能是由某些UB造成的,但您将其排除在问题的范围之外。挑剔:与printf中的%p”
说明符匹配的参数应为(void*)
,如果需要,可以使用强制转换。将任何指针类型参数传递给使用void*的函数时,不需要强制转换。在您的情况下,在同一地址分配不同变量的原因是什么?你能用解释更新答案吗?@leedinelcrockerprintf
没有void*
参数。指向不同类型的指针的大小不一定相同,因此对%p
说明符的%p
强制转换是预防性的。如果qtail->block
具有typeint
和&qtail->block=&max
,则您观察到的行为是完全定义好的,这正是人们所期望的。这两个指针的别名可能是由某些UB造成的,但您将其排除在问题的范围之外。挑剔:与printf中的%p”
说明符匹配的参数应为(void*)
,如果需要,可以使用强制转换。将任何指针类型参数传递给使用void*的函数时,不需要强制转换。在您的情况下,在同一地址分配不同变量的原因是什么?你能用解释更新答案吗?@leedinelcrockerprintf
没有void*
参数。指向不同类型的指针的大小不一定相同,因此(void*)
强制转换是预防性的,因为%p
说明符需要指定正确的值。