【问题标题】:struct variable initialization结构变量初始化
【发布时间】:2014-08-01 08:16:22
【问题描述】:

我尝试初始化结构变量如下:

struct Abc{
    char str[10];
};

int main(){
    struct Abc s1;
    s1.str="Hello";  //error
}

我可以理解这种行为,因为它与

char str[10];
str="Hello"; // incompatible types

但是看看下面的初始化

struct Abc s1={"Hello"};   //This is fine

struct Abc s2={.str="Hello"};  //This is also fine

我记得在我毕业的时候,我读了很多教科书,上面说这两个初始化是一回事(即使用 { } 符号初始化结构变量和显式使用 (.) 运算符是同一件事)。但上面的讨论证明它们并不相同。

我的问题是这些初始化之间到底有什么区别?

【问题讨论】:

  • str="你好";是赋值,不是初始化...
  • 您可能会发现 this 提供信息。
  • 前两个不是初始化。它们是任务。

标签: c struct initialization


【解决方案1】:

不同的是,这两行

struct Abc s1={"Hello"};   //This is fine
struct Abc s2={.str="Hello"};  //This is also fine

初始化,而这个

s1.str="Hello";

任务。您可以将 char 数组初始化为字符串文字,但不能通过赋值。

【讨论】:

  • 什么 ??s1.str="Hello";是不是初始化??
  • @A.s.Bhullar 类似于原生类型。 int n = 42; 正在初始化。而在int n; n = 42;中,n是未初始化的,然后赋值给42
  • 所以不是 s2={.str="Hello"};是作业吗?
  • @A.s.Bhullar 不,这是一种特殊形式的初始化,称为指定初始化。
  • ...但请记住,在为包含结构分配新值时,您仍然可以重新初始化数组,因为结构承认分配。
【解决方案2】:

thisstruct Abc s2={.str="Hello"};可以称为指定初始化,而struct Abc s1={"Hello"};一般初始化。

让我用例子来解释一下这种指定初始化的好处。

假设结构具有像 struct ex{ char *name; int age; char *city; char *country } 这样的变量。在这种情况下,如果您要初始化,只能使用城市和国家指定的初始化。 但是在一般初始化的情况下,每个成员都需要单独初始化。这也是程序员和复杂的开销。

【讨论】:

    【解决方案3】:

    以下赋值语句完全相同(但错误):

    s1.str="Hello"; & str = "Hello";.

    区别只是第一个是struct中的字符串。

    顺便说一下,初始化是指在定义时为变量赋值。

    struct Abc s1; 声明并定义了s1,因此您在此处将其初始化为:

    struct Abc s1={"Hello"};   //This is fine
    struct Abc s2={.str="Hello"};  //This is also fine 
    

    这样做

    struct Abc s1;
    s1.str="Hello";
    

    不是初始化,它只是将不兼容的str指针分配常量字符串文字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-07
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      • 2011-12-25
      • 2018-10-18
      • 2011-12-03
      相关资源
      最近更新 更多