繁体   English   中英

struct c 中的默认值 [重复]

[英]Default values in struct c [duplicates]

运行函数print_test() 时,下面的代码打印什么?

struct test {
  int a, b, c;
};

void print_test(void) {
  struct test t = {1};
  printf("%d/%d/%d", t.a, t.b, t.c);
}

解决方案 1\\0\\0

为什么 b 和 c 初始化为零,即使我没有这样做? 该结构是否有任何默认值? 但是,结构不是全局的,成员也不是静态的。 为什么它们会自动零初始化? 如果数据类型不是 int 另一个数据类型将被初始化为哪个值?

如果您没有为结构的所有成员指定足够的初始化程序,您将面临 零初始化,这会将其余成员初始化为0 我认为按照今天的标准,这似乎有点奇怪,尤其是因为 C++ 的初始化语法多年来已经发展和成熟了很多。 但是这种行为仍然是为了向后兼容。

我觉得现阶段我们需要知道两点:

  1. 常规变量和结构之间没有什么不同,如果它们在本地范围内,即automatic storage duration 它们将包含垃圾值。 使用这些值可能会调用未定义的行为。

唯一使结构不同的是,如果您至少初始化其中一个成员,则其余成员将被设置为零,即初始化为好像它们具有static storage duration 但是当没有任何成员被初始化时,情况就不是这样了。

  1. 这取决于您的声明。 如果您的声明在任何函数之外或使用static keyword (更准确地说,具有static storage duration ),则 x 的初始值是一个null pointer (可以写为 0 或 NULL)。

如果它在一个函数内,即它有automatic storage duration ,它的初始值是随机的(垃圾)。

考虑以下代码:

#include<stdio.h>
#include<unistd.h>

struct point {
    int x, y;
    char a;
    double d;
};    
typedef struct point Point;

void main(){ 
    Point p1;
    printf("\nP1.x: %d\n", p1.x);
    printf("\nP1.y: %d\n", p1.y);
    printf("\nP1.a: %d\n", p1.a);
    printf("\nP1.d: %lf\n", p1.d);

    Point p2 = {1};
    printf("\nP2.x: %d\n", p2.x);
    printf("\nP2.y: %d\n", p2.y);
    printf("\nP2.a: %d\n", p2.a);
    printf("\nP2.d: %lf\n", p2.d);
}

输出是:

P1.x: 0

P1.y: 66900

P1.a: 140

P1.d: 0.000000

P2.x: 1

P2.y: 0

P2.a: 0

P2.d: 0.000000

好读物: C 和 C++:自动结构的部分初始化

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM