【问题标题】:Stack around the variable was corrupted when using sscanf_s使用 sscanf_s 时变量周围的堆栈已损坏
【发布时间】:2014-05-11 15:15:01
【问题描述】:

我不明白为什么我会收到错误“围绕变量“tmp”的堆栈已损坏”。

我在不同的函数中使用相同的代码,它运行良好,但现在当函数“返回”时,它会抛出上述错误。

struct frame {
   uint8_t dst[6]; 
   uint8_t src[6];    
};

//fill frame.dst || src exactly same way as code below without any errors or warnings

bool fcn() {

    uint8_t tmp[6];

    sscanf_s("00-00-00-00-00-00", "%x-%x-%x-%x-%x-%x", &tmp[0], &tmp[1], &tmp[2], &tmp[3], &tmp[4], &tmp[5]);
    //here I compare tmp[0] == frame.mac[0]...
    return true; 
} //here pops the error while debugging

我在程序的不同部分使用完全相同的代码,但没有任何错误。

【问题讨论】:

    标签: c visual-studio-2010 scanf unsigned-integer


    【解决方案1】:

    参考C-标准确认系统:

    要在 32 位机器上扫描 8 位值,需要使用 "hh" 长度修饰符。 32的一半是8


    对于 VC,需要使用一种解决方法扫描到 unsigned ints。

    【讨论】:

    • 所以这是在 Visual C 上,不是吗?
    • 我使用 Visual Studio 2010。
    • 谢谢,你能举个简单的例子吗?我无法让它“运行”。
    • 扫描到u_int时,我必须使用"hh""hx""x"
    • 要以十六进制从“字符串”扫描到unsigned int,请使用"x"u_int 不是标准类型,所以我不能说要使用哪个转换说明符。 @Kyslik
    【解决方案2】:

    %x 说明符写入int 参数,但您将指针传递给uint8_t。由于int 在您的平台上是一个较大的类型,因此当这些字段被写出时,您将覆盖内存。改为传递指向int 的指针,并根据需要将它们转换为所需的类型。

    您会希望在使用此代码的其他任何地方也这样做!

    【讨论】:

    • 你能解释一下为什么在一个函数中它可以工作,但在第二个函数中却没有吗?为什么系统一开始就检测不到“错误”?
    • 在这种情况下,您将覆盖用于从函数正确返回的堆栈的一部分。在其他情况下,您也在覆盖内存,但您碰巧没有覆盖任何对您的代码产生明显影响的东西,例如您可能会覆盖一些对齐填充或堆栈上不再使用的局部变量。您需要在任何地方解决此问题,因为更改编译器版本或修改周围的代码很容易导致“明显”问题。
    • 感谢上面的评论,现在我明白为什么了。
    猜你喜欢
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 2021-03-28
    • 2012-11-08
    • 2019-09-04
    • 2020-07-26
    相关资源
    最近更新 更多