当前位置:  开发笔记 > 编程语言 > 正文

未初始化的struct成员是否始终设置为零?

如何解决《未初始化的struct成员是否始终设置为零?》经验,为你挑选了2个好方法。

考虑一个C结构:

struct T {
    int x;
    int y;
};

当这部分初始化时,如

struct T t = {42};

TY保证是0或者这是编译器的实现决定?



1> Mehrdad Afsh..:

如果它被部分初始化,它保证为0,就像数组初始化器一样.如果没有初始化,它将是未知的.

struct T t; // t.x, t.y will NOT be initialized to 0 (not guaranteed to)

struct T t = {42}; // t.y will be initialized to 0.

同理:

int x[10]; // Won't be initialized.

int x[10] = {1}; // initialized to {1,0,0,...}

样品:

// a.c
struct T { int x, y };
extern void f(void*);
void partialInitialization() {
  struct T t = {42};
  f(&t);
}
void noInitialization() {
  struct T t;
  f(&t);
}

// Compile with: gcc -O2 -S a.c

// a.s:

; ...
partialInitialzation:
; ...
; movl $0, -4(%ebp)     ;;;; initializes t.y to 0.
; movl $42, -8(%ebp)
; ...
noInitialization:
; ... ; Nothing related to initialization. It just allocates memory on stack.


@Juliano:这些信息完全不正确.未明确初始化的全局变量(以及具有静态存储持续时间的所有变量)始终始终为零.这是C语言的基本部分,与您的操作系统无关.

2> bayda..:

标准草案第8.5.1.7项:

-7-如果列表中的初始值设定项少于聚合中的成员,则未明确初始化的每个成员都应默认初始化(dcl.init).[例:

struct S { int a; char* b; int c; };
S ss = { 1, "asdf" };

使用"asdf"初始化ss.a,使用"asdf"初始化ss.b,使用int()形式的表达式的值初始化ss.c,即0.


指针是否会正确初始化为NULL?
推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有