位移到打印位改变C中的int?

时间:2017-11-06 20:49:02

标签: c integer bit-shift bits

我只是试图打印出一个整数的位,看起来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。但不知何故,它正在发生变化。关于为什么会发生这种情况以及如何阻止它的任何想法?

1 个答案:

答案 0 :(得分:0)

最可能的解释是primes是一个悬空指针,指向一些先前返回的函数的堆栈帧(例如,您在某些先前函数中返回指向局部变量的指针并设置{{1}到那个结果)。这是未定义的行为,但通常会发生的情况是primes使用的堆栈上的内存被第一次调用primes的帧重用,因此被该调用修改。