Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么变量的值会发生变化(我在使用调试器时注意到值发生了变化)?_C_Debugging_Cs50_Stack Frame_Stack Corruption - Fatal编程技术网

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

C 为什么变量的值会发生变化(我在使用调试器时注意到值发生了变化)?,c,debugging,cs50,stack-frame,stack-corruption,C,Debugging,Cs50,Stack Frame,Stack Corruption,我提示用户输入一个卡号,然后对这个卡号应用一些公式,但是我注意到输出中预期的变化,因为变量的值在代码运行期间发生了变化,而没有重新分配它 变量“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

我提示用户输入一个卡号,然后对这个卡号应用一些公式,但是我注意到输出中预期的变化,因为变量的值在代码运行期间发生了变化,而没有重新分配它 变量“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");
    }
当您在堆栈上将card\u name声明为零长度字符数组时,如果first\u two\u digits>=51&&first\u two\u digits,则该值会更改。strcpy调用可能会由于溢出而破坏堆栈上的其他变量,例如card_to_use


至于在调用strcpy之前,当调试器声称您使用if…,这可能是由于优化。您可以在gcc和clang上使用-O0 compile标志禁用优化。请注意,在这种情况下,优化可能不会导致在条件检查之前调用。与条件检查相对应的某些指令可能在调用strcpy后执行。

我认为问题在于卡名称的定义。char card_name[0]没有为strcpy步骤中复制的字符分配任何空间

尝试将char card_name[0]更改为char card_name[30]。

char card_name[0]

此数组的空间为零,由[0]指定。当程序写入数组时,它会结束运行,损坏内存中的其他内容。将其更改为:

char card_name[20]


将在一个数组中分配20个字符空间来使用,这对于您的程序来说已经足够了。

您可以发布完整的吗?你有编译器警告吗?您是否尝试过使用地址消毒器-fsanize=address?卡名的缓冲区在哪里?strcpy是不安全的,已经有很长一段时间不推荐使用了。您应该在调试器中运行它,而不仅仅是运行它。使用char card_name[11]来避免堆栈缓冲区溢出错误。编译器应该为char card_name[0]提供一个错误;,如果你在标准模式下编译,这是一个好方法idea@TomServostrcpy没有被弃用,如果正确使用,它是安全的