c - 尝试连接二维数组的元素时出现段错误

标签 c dynamic-memory-allocation undefined-behavior c-strings strcat

我想使用strcat()来连接字符串数组的元素。我尝试过:

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

int main() {
    char **str = malloc(sizeof(char *) * 3);

    for (int i = 0; i < 3; i++) {
        str[i] = malloc(sizeof(char) * 8);
    }

    str[0] = "foo";
    str[1] = "bar";

    strcat(str[0], "H");

    for (int i = 0; i < 3; i++) {
        printf("%s\n", str[i]);
    }

    free(str);

    return 0;
}

我收到错误:

Segmentation fault (core dumped)

我应该怎样做才能正确?

最佳答案

对于初学者来说,程序存在内存泄漏。首先分配内存并将其地址存储在指针 str[i]

for (int i = 0; i < 3; i++) {
    str[i] = malloc(sizeof(char) * 8);
}

然后指针 str[0] 和 str[1] 被字符​​串文字的地址重新分配。

str[0] = "foo";
str[1] = "bar";

因此,您不能通过此语句更改字符串文字

strcat(str[0], "H");

因为这会调用未定义的行为

你必须写

strcpy( str[0], "foo" );
strcpy( str[1], "bar" );

还有这个循环

for (int i = 0; i < 3; i++) {
    printf("%s\n", str[i]);
}

还会调用未定义的行为,因为元素 str[2] 不是由字符串初始化的。

您需要更改条件或循环,例如 i < 2或初始化元素 str[2]。

并且您需要释放所有分配的内存,例如

for (int i = 0; i < 3; i++) {
    free( str[i] );
}

free( str );

关于c - 尝试连接二维数组的元素时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70414438/

相关文章:

c - 为什么发生段错误时索引不同

c++ - 创建非常大的动态数组

c++ - 如果 std::numeric_limits<float>::is_iec559 为真,这是否意味着我可以以明确定义的方式提取指数和尾数?

c - 我无法读取C中的文件

c - 空指针赋值错误

c - 如何在c中的函数中释放分配的数组

c - 还有其他半/可移植方法可以动态分配内存吗?

c - 无法理解指向指针输出的指针 : 15 15

java - 当delay为0时,Timer.schedule调度多长时间?

c++ - 在任何编程语言中回溯