【问题标题】:struct initialization failure结构初始化失败
【发布时间】:2011-03-10 18:26:12
【问题描述】:

我在下面的代码中初始化结构时遇到了困难。这甚至可以完成,还是我真的需要将 5 个字符的字符串 memcpy (urg) 到结构中?

struct MyStruct  
{  
    char x[5];  
};

main(...)  
{  
    const char* MyString = {"mnopq"}; // I understand this is a non-NULL terminated string -  
                                  // it's OK, I just want five character fields in an array

struct MyStruct = {MyString};     // <---This gives warnings below  
}

警告:初始化器周围缺少大括号
警告:初始化从没有强制转换的指针生成整数

如果我像这样包装初始化程序:

struct MyStruct = {{MyString}};

第一个警告消失了。第二个警告没有。因此,该结构未按预期初始化。

提前感谢您的帮助。

【问题讨论】:

  • 糟糕...这是 const char* MyString = "mnopq"; (没有大括号)
  • @user654077:抱歉,您的问题和您的 cmets 相互矛盾。如果它应该是const char* MyString = "mnopq",那么它一个以null结尾的字符串。然而,在代码 cmets 中,您说它不是。 ???决定你想要什么并编辑你的问题。这个时候就乱七八糟了。

标签: c struct initialization


【解决方案1】:

"mnopq" 是一个数组,const char * MyString 不是。

struct MyStruct foo = {"abcde"}; 将起作用,而您的方法将 指针 MyString 转换为整数值并将其分配给 x 的第一个元素。

【讨论】:

    【解决方案2】:

    您正在尝试用指针填充 char 数组。 MyString 被视为 const char * 而不是数组。将结构中的类型更改为 const char *x,它应该可以解决问题。此外,这里的 MyString 实际上是一个以 NULL 结尾的字符串。编译器将其设置到内存中,并在末尾添加额外的 NULL 字节,然后将 MyString 视为 const char *。

    如果您确实想要 char x[5] 而不是 const char *,您可以通过几种方式进行初始化,

    struct MyStruct ms = {{'m', 'n', 'o', 'p', 'q'}};
    

    或者你可以这样做

    struct MyStruct ms = {{ MyString[0], MyString[1], MyString[2], MyString[3], MyString[4]}};
    

    第一组大括号用于初始化struct成员,第二组用于初始化char数组成员,因此每个成员(char)都必须单独设置。

    【讨论】:

    • 我在上面编辑了一个标识符。另一件事是 MyString[index] 版本将在最后打印垃圾,而第一个版本不会(例如 mnopq¦ah¦)
    • 对,因为没有 NULL 终止符。但是在第一个示例的末尾也不应该有 NULL ......我认为他没有提到使用定义的打印函数将数组打印为字符串。
    【解决方案3】:

    您需要声明一个 MyStruct 类型的变量并将其 x 值分配给该字符串。 这应该有效:

    struct MyStruct {
    char x[5];
    };
    
    int main(int argc, char *argv[]) {
    
       struct MyStruct a;
       const char* MyString = "mnop";
    
       strncpy((a.x), MyString, 5);
    
       /* 
        *if within the 5 characters you do not have the null char it will 
        * also print garbage
        */
       printf("%s", a.x);
    
       return 0;
    }
    

    但是,您不能将指向 const char 的指针分配给 char 数组,因为它们是不同的类型。因此,您需要在结构中使用 char* 或使用 memcpy / strcpy 来获取信息。

    【讨论】:

      【解决方案4】:

      DavidMFrey 的答案是正确的,应该在我之前得到认可!但是,这是使用他的答案的源代码,因为我能够运行它:

      #include <stdio.h>
      struct MyStruct  
      {  
          char x[5];  
      };
      int main(void)  
      {  
          const char* MyString = "mnopq";
          struct MyStruct foo = {{ MyString[0], MyString[1], MyString[2], MyString[3], MyString[4]}};
          printf("foo.x is: %s\n", foo.x); // outputs: foo.x is: mnopq¦ah¦"
      
          struct MyStruct ms = {{'m', 'n', 'o', 'p', 'q'}};
          printf("ms.x is: %s\n", ms.x);   // ms.x is: mnopq
      
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-25
        • 2012-11-17
        • 2017-12-10
        • 2018-09-17
        相关资源
        最近更新 更多