我只是试图打印出一个整数的位,看起来int在某种程度上在这个过程中被改变了,但它似乎也在调用之间改变,而不是在函数的中间。 我的职责是:
void printBits(int bits){
int i = 0;
printf("BEFORE: %u\n", bits);
while(i < 32){
printf("%d", 1 & (bits >> i));
i++;
}
printf("\n");
printf("AFTER: %u\n", bits);
}
在我的主要部分,这里调用它然后程序退出(primes [0]只是正在使用的int):
printf("\nBEFORE PRINTBIT: %u\n", primes[0]);
printBits(primes[0]);
printBits(primes[0]);
printf("AFTER PRINTBITS: %u\n", primes[0]);
,输出为:
BEFORE PRINTBITS: 3450182216
BEFORE: 3450182216
00010010010110011010010110110011
AFTER: 3450182216
BEFORE: 2900726784
00000000001010011010011100110101
AFTER: 2900726784
AFTER PRINTBITS: 2900726784
在printBits调用之间没有调用任何内容,据我所知,printBits不会影响int。但不知何故,它正在发生变化。关于为什么会发生这种情况以及如何阻止它的任何想法?
答案 0 :(得分:0)
最可能的解释是primes
是一个悬空指针,指向一些先前返回的函数的堆栈帧(例如,您在某些先前函数中返回指向局部变量的指针并设置{{1}到那个结果)。这是未定义的行为,但通常会发生的情况是primes
使用的堆栈上的内存被第一次调用primes
的帧重用,因此被该调用修改。