C结构成员是字符串,如何直接分配字节

C结构成员是字符串,如何直接分配字节,c,string,struct,C,String,Struct,我正在处理一个简单的文件系统,它(显然)包含文件夹、文件等 在RAM中,文件夹(简化版)由结构表示,如下所示: typedef struct{ char label[20]; unsigned int id; t_node contents[50]; } folder; 现在,我显然希望标签包含原始字节字符串和名称(更好的是原始字符串没有尾随0,但这是我愿意做出的牺牲) 不,以下是我如何创建和使用结构: folder* myFolder = (folder *)

我正在处理一个简单的文件系统,它(显然)包含文件夹、文件等

在RAM中,文件夹(简化版)由结构表示,如下所示:

typedef struct{
     char label[20];
     unsigned int id;
     t_node contents[50];
 } folder;
现在,我显然希望标签包含原始字节字符串和名称(更好的是原始字符串没有尾随0,但这是我愿意做出的牺牲)

不,以下是我如何创建和使用结构:

folder* myFolder = (folder *) malloc(sizeof(folder));
myFolder->label = "name";

//Which doesn't work, if I try this:

char name[20] = "name";
myFolder->label = name;

//this too, doesn't work.
错误消息显示“当从类型“char*”分配给类型“char[20]”时,类型不兼容”。 我明白,但不知道如何解决

提前感谢

使用
strncpy()

你需要使用


数组不是可修改的左值,因此不能为其赋值。您有几种解决方案:

  • 标签
    声明为指向
    字符
    的指针
  • 使用strcpy(或同等工具)
尝试使用
strncpy()

而不是

myFolder->label = "name";
不能使用赋值运算符填充数组,在这种情况下,“name”的右侧将解析为char指针


此外,我还建议将常数20替换为某个已定义的常数,以指示该值是多少(即MAX\u FOLDER\u LABEL\u LEN)。

我不同意<代码>strncpy并不比strcpy更安全。引入它是为了处理结构中的固定长度名称字段,而不是提供一个“有界的”
strcpy
@Kirilenko:嗯,我们正在处理一个固定长度的结构字段,不是吗?“strncpy最初被引入C库,用于处理目录项等结构中的固定长度名称字段。此类字段的使用方式与字符串不同:对于最大长度字段,尾部null是不必要的,将较短名称的尾部字节设置为null可确保有效的字段级比较。strncpy从起源上讲并不是一个“有界strcpy”,委员会更倾向于承认现有的实践,而不是修改函数以更好地适应这种使用。“现在这不是很实际(您的第一个选择),因为节点是文件系统的一部分(将写入磁盘).仅仅因为malloc指出了这一点,就在fs中的其他地方找到标签,这将使其变得相当缓慢。不过,这一建议是受欢迎的。
strcpy(myFolder->label, "name");
strncpy( myFolder->label, "name", 20 );
myFolder->label = "name";