代码之家  ›  专栏  ›  技术社区  ›  Scottie T

使用printf时出现segfault

  •  2
  • Scottie T  · 技术社区  · 16 年前

    我正在一个信号处理程序中调试一些LinuxC代码,以查找浮点异常。目标是检查浮点寄存器,打印一些信息,然后中止。在尝试打印 (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)
        ...
    }
    

    这不是计算 (字符)('0'+phyreg) 这就是问题所在,因为当我将它移动到一个单独的行并将结果存储在一个临时变量中时,在printf尝试显示临时变量之前,我不会得到segfault。那么,导致segfault的错误在哪里?

    3 回复  |  直到 16 年前
        1
  •  7
  •   Antti Huima    16 年前

    您正在用%s打印。应该是“fp%c:尾数=%s”。

        2
  •  3
  •   Lasse V. Karlsen    16 年前

    %S代表一个字符串,你给它一个字符。printf将此字符值解释为指向要打印字符串的第一个字符的指针,当然,这将导致严重失败。

    将字符放入包含2个元素的字符数组中,第二个元素为'\0',或者查看printf是否具有可计算为字符的值。

        3
  •  3
  •   Zach Scrivena    16 年前

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