【问题标题】:C structure member is a string, how to assign bytes directlyC结构成员是字符串,如何直接分配字节
【发布时间】:2012-10-27 17:44:45
【问题描述】:

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

一个(a 的简化版本)文件夹在 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]’时类型不兼容”。 我明白了,但不知道如何解决。

提前致谢

【问题讨论】:

    标签: c string struct


    【解决方案1】:

    使用strncpy():

    char name[20] = "name";
    strncpy(myFolder->label, name, sizeof(myFolder->label) - 1);
    myFolder->label[sizeof(myFolder->label) - 1] = 0;
    

    【讨论】:

    • 我不同意; strncpy 并不比 strcpy 更安全。引入它是为了处理结构中的固定长度名称字段,而不是提供“有界”strcpy
    • @Kirilenko:好吧,我们正在处理一个固定长度的结构字段,不是吗?
    • "strncpy 最初被引入到 C 库中,用于处理目录条目等结构中的固定长度名称字段。此类字段的使用方式与字符串不同:尾随 null 对于一个最大长度字段,并将较短名称的尾随字节设置为 null 可确保有效的逐字段比较。strncpy 的起源不是“有界 strcpy”,委员会更愿意承认现有做法,而不是将函数更改为更适合这种用途。”
    【解决方案2】:

    尝试使用strncpy()

    strncpy( myFolder->label, "name", 20 );
    

    而不是

    myFolder->label = "name";
    

    您不能使用赋值运算符来填充数组,在这种情况下,“name”的右侧将解析为 char 指针。

    另外,我建议用一些已定义的常量替换常量 20,指示值是什么(即 MAX_FOLDER_LABEL_LEN)。

    【讨论】:

      【解决方案3】:

      你需要使用strcpy

      strcpy(myFolder->label, "name");
      

      【讨论】:

        【解决方案4】:

        数组不是可修改的左值,所以你不能给它赋值。您有几种解决方案:

        • label 声明为指向char 的指针;
        • 使用strcpy(或等效项)。

        【讨论】:

        • 现在这不太实用(您的第一个选项),因为节点是文件系统的一部分(将被写入磁盘)。仅仅因为 malloc 指向那里而将标签定位在 fs 中的任何其他位置会使其非常缓慢。不过这个建议很受欢迎。
        猜你喜欢
        • 2013-12-26
        • 2017-02-23
        • 2021-07-10
        • 1970-01-01
        • 1970-01-01
        • 2018-05-10
        • 2021-05-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多