【问题标题】:What is it mean by exit code 139 in C programming when i compile a code? [duplicate]当我编译代码时,C 编程中的退出代码 139 是什么意思? [复制]
【发布时间】:2021-10-27 14:16:40
【问题描述】:

我尝试在 Clion ide 中运行如下所示的简单 C 代码,每次编译时,都会显示以下消息:

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

C 代码:

#include <stdio.h>
#include <string.h>

int main(void)
{
    char ch = 'A';
    short s = ch;
    printf(s);

    printf("\n________________________\n");

    short s2 = 67;
    char ch2 = s2;
    printf(ch2);

    return 0;
}

【问题讨论】:

  • printf(s);printf(ch2); 一样是未定义的行为。请看exit code 139 site:stackoverflow.com
  • 您是否收到任何编译器警告?如果是这样,您应该注意它们。
  • 追踪这样的崩溃的快速方法:在调试工具中运行程序,该工具应该与您的开发工具一起提供(如果您的工具没有调试器,请获取新工具)。当程序崩溃时,调试器将停止并允许您检查崩溃现场。如果它没有在您的代码中崩溃,请使用回溯(通常称为调用堆栈)来查找您的代码调用未知代码的位置。检查传递给函数的参数,并确保它们与函数文档所说的您应该提供的相匹配。
  • 如果一切都匹配,事情会变得更难。进一步回顾代码中的一个错误,该错误可能会致命地伤害程序而不会立即崩溃。如果您没有发现问题,您可能必须逐行检查导致崩溃的原因,并注意程序走错路径或存储错误值等意外行为。意外通常是错误,如果不是,则意味着您的期望是错误的。任何一个问题都需要解决。

标签: c printf undefined-behavior


【解决方案1】:

https://www.cplusplus.com/reference/cstdio/printf/ 需要一个指向以 0 结尾的字符串的指针。您正在传递一些被解释为地址的短值(A,即 65)。

【讨论】:

    【解决方案2】:

    这里的错误代码 139 表示由于您没有在代码中使用格式说明符而出现的段错误,正确的代码将是

    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
        char ch = 'A';
        short s = ch;
        printf("%d",s);
    
        printf("\n________________________\n");
    
        short s2 = 67;
        char ch2 = (char)s2;
        printf("%c",ch2);
    
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      你的问题是线路

      printf(s);
      

      printf 期望它的第一个参数是格式字符串,并且参数的类型必须是 const char *。它试图将s 视为字符串的地址,但'A' 的值(ASCII 中的65)不是有效地址,因此出现错误。

      要打印s 的值,您需要执行类似的操作

      printf( "%hd", s );
      

      格式说明符%hd 告诉scanf 期待short 参数,并将与其值等效的字符串打印为十进制数字("65")。

      您在第二次printf 通话中遇到了类似问题。

      【讨论】:

        【解决方案4】:

        您可以按如下方式使用类型转换和格式说明符:

        #include <stdio.h>
        #include <string.h>
        
        int main(void)
        {
            char ch = 'A';
            short s = ch;
            
            //short format specifier
            printf("%hd",s);
        
            printf("\n________________________\n");
        
            short s2 = 67;
        
            //int to char
            char ch2 = (char)s2;
        
            //char format specifier
            printf("%c",ch2);
        
            return 0;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-04-21
          • 1970-01-01
          • 1970-01-01
          • 2015-10-08
          • 2013-05-15
          • 2022-07-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多