将 char * 数组深度复制到结构中?

Deep copy char * array into struct?

提问人:An Assembler 提问时间:10/9/2023 更新时间:10/9/2023 访问量:70

问:

这可能是一个非常初学者的问题,所以请放轻松......

我有一个结构体数组,如下所示

struct Data {
   int lineno;
   char* line[10];
}

struct Data datas[20] = {{ 0, NULL }};

我正在尝试将 char * [] 深度复制到数组元素中,但我不断出现 seg 错误。

我尝试了以下方法

for (int i = 0; i < 20; i++) {
    strcpy(datas[slot].line[i], line[i]);
}

但这行不通。 我以为我的问题是试图在行中复制空值,所以我尝试了以下操作

for (int i = 0; i < 20; i++) {
    if (line[i])
        strcpy(datas[slot].line[i], line[i]);
}

但这也行不通。

数组 C 字符

评论

2赞 dbush 10/9/2023
每个人都需要指向一些东西。datas[slot].line[i]
0赞 An Assembler 10/9/2023
我需要为每个 datas[slot].line 添加一个 char * [] 吗?
0赞 Sasha 10/9/2023
例如,您需要为每个 ,自己计算出或自己计算出的长度,然后执行......iline[i]strlendatas[slot].line[i] = malloc(length_you_got)
0赞 Sasha 10/9/2023
但也要注意考虑字符串中结束 0 的额外长度字符......
0赞 An Assembler 10/9/2023
Strlen 是用于字符串的,不是吗?我正在尝试复制字符串数组。但是我会尝试在复制之前分配内存

答:

2赞 Ted Lyngmo 10/9/2023 #1

在复制字符串之前,您需要分配内存。大多数实现都支持分配内存和复制字符串:strdup

for (int i = 0; i < 20; i++) {
    datas[slot].line[i] = strdup(line[i]);
}

如果您的实现不支持 ,您可以创建自己的:strdup

#include <stdlib.h>
char *StrDup(const char* str) {
    size_t len = strlen(str) + 1;
    char *res = malloc(len);
    if (res) memcpy(res, str, len);
    return res;
}

评论

0赞 An Assembler 10/9/2023
我试过这个,但仍然得到一个段错误......
0赞 Ted Lyngmo 10/9/2023
@AnAssembler 在这种情况下,也不指向分配的内存。如何定义和初始化?line[i]line
1赞 An Assembler 10/9/2023
是的,似乎是这样......谢谢
0赞 Ted Lyngmo 10/9/2023
@AnAssembler 不客气!很高兴它有帮助!
0赞 Chris 10/9/2023
OIP 的结构体有一个包含 10 个字符指针的数组。OP 的代码从 0 循环到 19,并使用它来索引成员数组。这似乎也是段错误的合理原因。iline