C结构成员是字符串,如何直接分配字节
我正在处理一个简单的文件系统,它(显然)包含文件夹、文件等 在RAM中,文件夹(简化版)由结构表示,如下所示: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 *)
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";