【问题标题】:why I get illegal hardware instruction message from a simple code? [duplicate]为什么我从一个简单的代码中得到非法的硬件指令信息? [复制]
【发布时间】:2022-01-01 11:59:12
【问题描述】:
#include <stdio.h>
#include <string.h>

int main()
{
    char s1[] = "harry";
    char s2[] = "ravi";
    char s3[54];

    puts(strcat(s1, s2));
    
    strcpy(s3 ,strcat(s1, s2));
    puts(s3);
    
    return 0;
} 
  

这是我会得到的错误

cd "/Users/deepkar/Desktop/C_COURSE/" && gcc tut27.c -o tut27 && "/Users/deepkar/Desktop/C_COURSE/"tut27
deepkar@Deeps-Air C_COURSE % cd "/Users/deepkar/Desktop/C_COURSE/" && gcc tut27.c -o tut27 && "/Users/deepkar/Desktop/C_COURSE/"tut27
zsh: illegal hardware instruction  "/Users/deepkar/Desktop/C_COURSE/"tut27
deepkar@Deeps-Air C_COURSE % 

【问题讨论】:

  • s1 没有空间容纳组合字符串。行为未定义。
  • strcat 函数不会创建新字符串。它将第二个字符串附加到第一个字符串。第一个字符串必须有足够的空间容纳组合字符串,包括空终止符。
  • 在此处查看此字符串处理常见问题解答:Common string handling pitfalls in C programming

标签: c string header-files hardware illegal-instruction


【解决方案1】:

问题来自您的代码具有未定义的行为:

您调用strcat(s1, s2); 两次,试图从s1 指向的数组末尾处复制s2 中的字符,但s1 已经包含一个字符串"harry",它连同它的空终止符一起填充完整的数组,char s1[] = "harry"; 的定义给它一个 6 个字节的长度。 strcat 写入到数组 s1 之外,覆盖了重要数据,例如函数 main 的返回地址。观察到的行为与 CPU 分支到无效地址一致。

您可以将s1 复制到s3 并将s2 连接到该位置。

【讨论】:

    猜你喜欢
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 2013-04-29
    相关资源
    最近更新 更多