如何初始化(复杂?)结构

时间:2012-07-08 23:24:16

标签: c struct initialization

让我们定义这个结构:

struct MyStruct {
    int firstInt;
    int secondInt;
    char * firstString;
    char * secondString;
};

我正在尝试初始化这样的结构:

MyStruct s = {4, 5, {'a', 'b', 'c'}, "abc"};

但它不起作用。有什么办法吗? (firstString必须在末尾没有'\ 0')

4 个答案:

答案 0 :(得分:4)

由于您的要求是最后没有空终结符,您必须使用firstString的数组:

struct MyStruct {
    int firstInt;
    int secondInt;
    char firstString[3];
    char * secondString;
};

然后你可以像这样初始化它:

MyStruct s = {4, 5, {'a', 'b', 'c'}, "abc"};

您无法使用char*初始化{'a', 'b', 'c'},因为您必须为字符提供存储空间,char*只能指向某些内容。 "abc"恰好是一个常量字符串文字,存储在只读内存中,因此您可以在此处生成char*点。

此外,在C ++中,"abc"是一个我无法修改的常量,因此您应该将char * secondString;更改为const char * secondString;

答案 1 :(得分:2)

您可以使用复合文字:

struct MyStruct {
    int firstInt;
    int secondInt;
    char * firstString;
    char * secondString;
};

struct MyStruct s = { 4, 5, (char[]){'a', 'b', 'c'}, "abc" };

该构建体在C99中引入;见the N1256 draft的第6.5.2.5节。一些编译器(特别是微软)可能不支持它。

请注意,在C中,struct MyStruct类型不能仅称为MyStruct;这是C和C ++之间的区别。确保你正在编译你认为的语言。

需要注意的一件事是与复合文字相关联的对象的生命周期。字符串文字表示具有静态生存期的数组对象,即该对象存在于整个程序执行中。与(char[]){'a', 'b', 'c'}关联的数组对象如果发生在函数体外,则具有静态存储持续时间,但如果它出现在函数体内,则自动存储持续时间(与最内部封闭块相关联)。如果您尝试在其定义的块之外传递s的副本,则可能会出现问题。

答案 2 :(得分:0)

出现了一个微妙的问题。你的结构有两个char *,但没有存储来支持这些指针。你可能想要这样的东西:

struct MyStruct {
    int firstInt;
    int secondInt;
    char firstString[3];
    char secondString[4];
};

答案 3 :(得分:-1)

#include <iostream>

using namespace std;

struct MyStruct {
    int firstInt;
    int secondInt;
    char * firstString;
    char * secondString;
};

int main()
{
    char arr[] = {'a', 'b', 'c','\0'};
    MyStruct s = {4, 5, arr, "abc"};

    cout << s.firstString << endl;

    return 0;
}

MyStruct s = {4, 5, {'a', 'b', 'c'}, "abc"};

{'a', 'b', 'c'} have no memory to store.It's a r-value. 

- 我想。 ^ - ^