c - 使用 printf 时出现段错误

标签 c segmentation-fault printf

我正在为浮点异常调试信号处理程序中的一些 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 尝试显示临时变量之前,不会出现段错误。那么,导致段错误的错误在哪里?

最佳答案

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

关于c - 使用 printf 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/546701/

相关文章:

c - 如果我从一个函数返回而不调用 pthread_mutex_unlock 会发生什么?

c - 不同的逻辑地址

c++ - 开源 C/C++ 3d 渲染器(支持 3ds max 模型)

c++ - smart_ptr 到类段错误的属性

c - 将 fprintf 从缓冲区写入文件但每 100 个字符后换行的策略?

c - C中的二进制搜索功能

C 段错误,即使使用 EOF

c - 我的链接列表没有正确添加(不断替换第 3 个位置)- c

C++ 覆盖运算符 const char*

c - 为什么百分比字符在 C 中没有用反斜杠转义?