【问题标题】:How to initialize a (complex?) struct如何初始化(复杂?)结构
【发布时间】:2012-07-08 23:24:16
【问题描述】:

让我们定义这个结构:

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

我正在尝试像这样初始化一个结构:

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

但它不起作用。有什么办法吗? (要求firstString结尾不能有'\0')

【问题讨论】:

  • 指针是 NOT 数组。使用数组!
  • 为什么不 MyStruct s = {4, 5, "abc", "abc"};?没有真正的语义差异;您必须在某处存储 firstString 只有 3 个字符的事实,并且 \0 可能会在您的版本中的 c 之后出现在内存中(如果有效)。
  • 您可能希望接受您提出的问题的答案。

标签: c struct initialization


【解决方案1】:

由于您的要求是末尾没有空终止符,因此您必须为firstString 使用数组:

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

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

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

您不能用{'a', 'b', 'c'} 初始化char*,因为您必须为字符提供存储空间,char* 只能指向某物。 "abc" 恰好是存储在只读内存中的常量字符串文字,因此您可以将 char* 指向那个位置。

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

【讨论】:

  • 一个char*可以很容易地指向一个char数组的(第一个元素),没有终止'\0';您只需要一些其他方法来跟踪有多少字符。能不能直接初始化是另外一个问题。
  • 无论如何我可以为 firstString 设置不同的大小(在不同的声明结构中)? (我的意思是,我不必提前知道数组的长度?)
  • @Trollkemada:您使用的是C 还是C++?答案会有所不同。
  • 我正在使用 C(对不起,错误)
【解决方案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 的副本,这可能会出现问题。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • "abc" 是一个有存储空间的常量字符串,所以char* s = "abc";是合法的。
    【解决方案4】:
    #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. 
    

    ——我想。 ^-^

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-21
      • 1970-01-01
      相关资源
      最近更新 更多