问题描述
我正在提示用户输入卡号,然后在这个号码上应用一些公式,但我注意到输出中的预期变化,因为在代码运行期间变量的值发生了变化,而没有重新分配它
变量“long card
”的值发生了变化。
long card = checkNumber();
const long card_to_use = card;
char card_name[0];
int cardL = (floor(log10(card)) + 1);
const int first_two_digits = card_to_use/myPow(10,cardL-2);
const int first_digit = card_to_use/myPow(10,cardL-1);
if(first_two_digits>=51 && first_two_digits<=55){
strcpy(card_name,"mastercard");
}else if (first_two_digits==37 || first_two_digits==34){
strcpy(card_name,"amex");
}else if(first_digit == 4){
strcpy(card_name,"visa");
}
执行 if(first_two_digits>=51 && first_two_digits<=55)
时值会发生变化我不知道究竟是为什么?
我试图从一开始就在 const long card_to_use
中捕获它的值,但它实际上也更改为 19 位数字,这也令人惊讶。
感谢阅读
ps:我使用的是 cs50 IDE
解决方法
您已将 card_name
声明为堆栈上的零长度字符数组。由于溢出,strcpy()
调用可能正在破坏堆栈上的其他变量(例如 card_to_use
)。
至于在调用 strcpy()
之前 当调试器声称您与 if (...)
处于同一行时这是如何发生的,这可能是由于优化。您可以在 gcc 和 clang 上使用 -O0
编译标志禁用优化。请注意,在这种情况下,优化可能不会在条件检查之前导致调用发生。某些与条件检查相对应的指令可能在调用 strcpy()
后正在执行。
我相信问题是card_name的定义。 char card_name[0]
不会为 strcpy() 步骤期间复制的字符分配任何空间。
尝试将 char card_name[0]
更改为 char card_name[30]
。
char card_name[0];
此数组的空间为零,由 [0] 指定。当程序写入数组时,它会运行到最后,破坏内存中的其他内容。将其更改为:
char card_name[20];
将在数组中分配 20 个字符空间以供使用,这对于您的程序来说似乎足够了。