在不同的字符串上使用函数后,字符串的值神奇地改变了

Value of string magically changes after function is used on a different string

如此 dbg 调试日志所示,string1 = '0' <repeats 28 times>, "1000" 在 intToBinary(num1, string1) 函数调用后打印。但随后在下一条指令中调用了 intToBinary(num2, string2) 。如您所见, 不同的 参数被传递给 intToBinary 函数。为什么变量 string1 会受到第二次使用 不同 变量调用函数的影响?在日志中,它表示第一个字符从 0 变为 \(或 [=15=]?)。

如果需要,这里是函数的 pastebin。 http://pastebin.com/EsQNMjej

void intToBinary(int num, char* string)
{
    string[32] = '[=10=]';
    int i,j;
    int temp = num;

    // is num negative?
    int isNegative = num < 0 ? 1 : 0;

    //negate all bits and add 1 (two complements)
    if(isNegative)
    {
        temp = -1 * temp; //absolute value

        //In order to get the negative number in
        // 2's complement you can either negate and
        // increment, or decrement by 1 and negate.
        //In this function, temp gets negated after
        //the conversion to string
        --temp;
    }

    //Write binary of positive num to string
    for(i = 0, j = 31; i < 32; i++,j--)
    {
        if(pow(2,j) <= temp)
        {
           //Temp is decreased when the bit is 1
           temp = temp - pow(2, j);
           string[i] = '1';
        }
        else
        {
            //Nothing happens to temp when the bit is 0
            string[i] = '0';
        }
    }

    if(isNegative)
    {
        for(i = 0; i < 32; i++)
        {
            //negate bits
            string[i] = string[i] == '1' ? '0' : '1';
        }
    }
}

我只是不明白这里发生了什么。我试着调换两个函数调用的顺序,所以变成了下面的

intToBinary(num2, string2);
intToBinary(num1, string1);

神奇的是,第一个字节保持 '0',这正是我想要的。但现在我只想知道为什么这首先发生了变化......

string[32] = '[=10=]';

这会溢出您的输入缓冲区。而且我认为您会发现您的 string1 在内存中紧跟在 string2 之后。所以溢出 string2 1 个字节将 运行 变成 string1.

您正在尝试以 32 字节存储一个 32 位二进制数;您忘记为空终止符分配一个额外的字节。当在 string2 之后写入 null 时,它会破坏 string1.

的开始

未定义的行为(超出数组末尾的写入)导致未定义的结果。