struct初始化失败

时间:2011-03-10 18:26:12

标签: c struct initialization

我在下面的代码中初始化结构时遇到了困难。甚至可以这样做,还是我真的需要将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}};

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

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

您正尝试使用指针填充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)必须单独设置。

答案 2 :(得分:0)

您需要声明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来获取信息。

答案 3 :(得分:0)

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;
}