首页 > 解决方案 > 如何正确将 strcat 用于 char 数组?

问题描述

我正在尝试将另一个字符串连接到 arg[0]。

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

int main() {

    char* arg[] = {
        "Hello",
        NULL,
        NULL,
        NULL
    };

    strcat(arg[0], " World");

}

这将返回中止陷阱。

我究竟做错了什么?

标签: carraysstringstring-literalsstrcat

解决方案


您正在尝试使用以下内容重写字符串文字

char* arg[] = { "Hello", ..... };    // "Hello" is a string literal, pointed to by "arg[0]".

strcat(arg[0], " World");       // Attempt to rewrite/modify a string literal.

这是不可能的。

字符串文字只能读取,不能写入。这就是使它们“字面意思”的原因。


如果你想知道为什么:

char* arg[] = { "Hello", ..... }; 

暗示"Hello"作为字符串文字,您应该阅读该问题的答案:

char s[] 和 char *s 有什么区别?


顺便说一句,如果您这样做,甚至不可能(或至少在运行时出现分段错误):

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

int main() {

    char a[] = "Hello";  // 6 for holding "Hello" (5) + "\0" (1). 

    strcat(a, " World");   

}

因为数组a需要有 12 个字符来连接两个字符串并使用strcat(a, " World");- "Hello"(5 个字符) + " World"(6 个字符) + \0(1 个字符),但它只有 6 个字符来保存"Hello"+ \0。使用时不会自动将内存空间添加到数组中strcat()

如果您使用这些语句执行程序,则您正在编写超出未定义行为的数组边界,这可能会提示您出现 Segmentation Fault 错误。


推荐阅读