为什么我的变量的值会发生变化我在使用调试器时注意到该值发生了变化?

问题描述

我正在提示用户输入卡号,然后在这个号码上应用一些公式,但我注意到输出中的预期变化,因为在代码运行期间变量的值发生了变化,而没有重新分配它 变量“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 个字符空间以供使用,这对于您的程序来说似乎足够了。