【问题标题】:Simple C program using <string.h> methods not running使用 <string.h> 方法的简单 C 程序未运行
【发布时间】:2021-10-08 20:05:54
【问题描述】:

我有以下代码。

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

int main()
{
    char first[] = "foo";
    char last[] = "bar";
    
    strcat(first, last);
    
    printf("%s\n", first);

    return 0;
}

它可以编译,但是当我运行它时出现以下错误:

zsh: illegal hardware instruction ./output/strfunc.out

作为参考,我使用 clang 编译代码:

Apple clang version 12.0.5 (clang-1205.0.22.9)
Target: x86_64-apple-darwin20.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

我似乎无法使用与 相关的任何方法。我上网查了一下,什么都没有,有什么想法吗?

【问题讨论】:

  • first 的大小正好适合"foo"。使用strcat 添加它会导致未定义的行为。尝试显式调整数组大小char first[128] = "foo";
  • first 是一个大小为 4 的数组。它没有任何空间可以添加更多数据。
  • char first[] = "foo"; 更改为char first[7] = "foo"; 以便foo 有足够的空间来存储结果字符串"foobar"

标签: c string.h


【解决方案1】:
char first[] = "foo";

这告诉编译器创建一个大小正好适合初始化字符串的数组。它没有空间可以添加更多字符。因此,尝试使用 strcat 将字符串添加到末尾会导致缓冲区溢出,从而导致未定义的行为。

一种解决方案是显式调整数组的大小:

#define MAX_SIZE 32
char foo[MAX_SIZE] = "foo";

【讨论】:

  • 所以在上面的用例中,我需要明确地将数组 foo 的大小设置为字符串的长度 + 1? (按字节)
  • 是的,您需要调整数组的大小以适应最终的字符串。至少是strlen("foobar")+1
猜你喜欢
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
相关资源
最近更新 更多