【问题标题】:Segfault when using printf使用 printf 时的段错误
【发布时间】:2010-10-07 11:56:23
【问题描述】:

我正在调试浮点异常的信号处理程序中的一些 Linux C 代码。目标是检查浮点寄存器,打印一些信息,然后中止。尝试打印(char)('0' + phyreg) 的结果时出现分段错误。

struct ucontext *   uc = (struct ucontext *) data;
fpregset_t      fp = uc -> uc_mcontext.fpregs;

int top = (fp -> sw >> 11) & 0x07;
int i,j,k;
for (i = 0; i < 8; i++) {
    static const char * tags [] = {
        "valid", "zero", "invalid/infin", "empty"
    };
    int phyreg = (top + i) & 0x07;
    struct _libc_fpreg* r = &(fp -> _st [phyreg]);
    const char* regExp = (((r->exponent & 0x8000) != 0) ? "-" : "+");
    printf ("  FP %s: Mantissa= %s",
            (char) ('0' + phyreg), // reg stack (SIGSEGV here)
            regExp); // register exponent sign
    j = (r->significand[3] >> 15) & 0x01;
    printf ("%s.",(char) ('0' + j)); // mantissa (Also SIGSEGV here when
                                     // previous SIGSEGV is commented out)
    ...
}

这不是(char)('0' + phyreg) 的计算问题,因为当我将它移动到单独的行并将结果存储在临时变量中时,直到 printf 尝试显示临时变量时我才得到段错误。那么,导致段错误的错误在哪里?

【问题讨论】:

    标签: c segmentation-fault printf


    【解决方案1】:

    您正在使用 %s 打印。应该是“ FP %c: Mantissa = %s”。

    【讨论】:

    • 呃!我已经很久没有使用 printf 了。我知道这可能很明显,但我只是没有看到。
    【解决方案2】:

    %s 表示一个字符串,你给它一个字符。这个字符值被 printf 解释为指向要打印的字符串的第一个字符的指针,这当然会严重失败。

    将字符放入一个有 2 个元素的字符数组中,第二个元素是 '\0',或者看看 printf 是否有计算结果为字符的东西。

    【讨论】:

      【解决方案3】:

      将%c format specifier 用于单个字符,而不是%s(应该用于null 终止的字符串)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-12
        • 1970-01-01
        • 2018-06-06
        • 1970-01-01
        相关资源
        最近更新 更多