C 一个整数无缘无故地改变了自己,这可能是因为内存问题吗?

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,但在结构内部,问

我有一个长程序,里面有一个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("%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*的函数时,不需要强制转换。在您的情况下,在同一地址分配不同变量的原因是什么?你能用解释更新答案吗?@leedinelcrocker
printf
没有
void*
参数。指向不同类型的指针的大小不一定相同,因此对
%p
说明符的
%p
强制转换是预防性的。如果
qtail->block
具有type
int
&qtail->block=&max
,则您观察到的行为是完全定义好的,这正是人们所期望的。这两个指针的别名可能是由某些UB造成的,但您将其排除在问题的范围之外。挑剔:与printf中的
%p”
说明符匹配的参数应为
(void*)
,如果需要,可以使用强制转换。将任何指针类型参数传递给使用void*的函数时,不需要强制转换。在您的情况下,在同一地址分配不同变量的原因是什么?你能用解释更新答案吗?@leedinelcrocker
printf
没有
void*
参数。指向不同类型的指针的大小不一定相同,因此
(void*)
强制转换是预防性的,因为
%p
说明符需要指定正确的值。