在不同的字符串上使用函数后,字符串的值神奇地改变了
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
.
的开始
未定义的行为(超出数组末尾的写入)导致未定义的结果。
如此 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
.
未定义的行为(超出数组末尾的写入)导致未定义的结果。