【发布时间】:2012-10-03 06:05:55
【问题描述】:
如果我在 C 中有一个包含整数和数组的结构,我如何将整数初始化为 0,将数组的第一个元素初始化为 0,如果该结构是另一个结构的成员,那么对于另一个结构是整数和数组有那些初始化值?
【问题讨论】:
-
说明您的问题的代码示例会更好...
标签: c
如果我在 C 中有一个包含整数和数组的结构,我如何将整数初始化为 0,将数组的第一个元素初始化为 0,如果该结构是另一个结构的成员,那么对于另一个结构是整数和数组有那些初始化值?
【问题讨论】:
标签: c
初始化器可以嵌套在嵌套结构中,例如
typedef struct {
int j;
} Foo;
typedef struct {
int i;
Foo f;
} Bar;
Bar b = { 0, { 0 } };
【讨论】:
我希望这个示例程序对您有所帮助....
#include <stdio.h>
typedef struct
{
int a;
int b[10];
}xx;
typedef struct
{
xx x1;
char b;
}yy;
int main()
{
yy zz = {{0, {1,2,3}}, 'A'};
printf("\n %d %d %d %c\n", zz.x1.a, zz.x1.b[0], zz.x1.b[1], zz.b);
return 0;
}
yy zz = {{0, {0}}, 'A'}; 将初始化数组 b[10] 的所有元素将设置为 0。
就像@unwind 建议一样,在 C 中创建的所有实例都应该手动初始化。这里没有构造函数类型的机制。
【讨论】:
您可以使用 {0} 对整个结构进行 0 初始化。
例如:
typedef struct {
char myStr[5];
} Foo;
typedef struct {
Foo f;
} Bar;
Bar b = {0}; // this line initializes all members of b to 0, including all characters in myStr.
【讨论】:
C 没有构造函数,因此除非您在每种情况下都使用初始化表达式,即编写类似的东西
my_big_struct = { { 0, 0 } };
要初始化内部结构,您必须添加一个函数并确保在所有“实例化”结构的情况下都调用它:
my_big_struct a;
init_inner_struct(&a.inner_struct);
【讨论】:
这是一个替代示例,您将如何使用面向对象的设计来做这样的事情。请注意,此示例使用运行时初始化。
mystruct.h
#ifndef MYSTRUCT_H
#define MYSTRUCT_H
typedef struct mystruct_t mystruct_t; // "opaque" type
const mystruct_t* mystruct_construct (void);
void mystruct_print (const mystruct_t* my);
void mystruct_destruct (const mystruct_t* my);
#endif
mystruct.c
#include "mystruct.h"
#include <stdlib.h>
#include <stdio.h>
struct mystruct_t // implementation of opaque type
{
int x; // private variable
int y; // private variable
};
const mystruct_t* mystruct_construct (void)
{
mystruct_t* my = malloc(sizeof(mystruct_t));
if(my == NULL)
{
; // error handling needs to be implemented
}
my->x = 1;
my->y = 2;
return my;
}
void mystruct_print (const mystruct_t* my)
{
printf("%d %d\n", my->x, my->y);
}
void mystruct_destruct (const mystruct_t* my)
{
free( (void*)my );
}
main.c
int main (void)
{
const mystruct_t* x = mystruct_construct();
mystruct_print(x);
mystruct_destruct(x);
return 0;
}
您不一定需要使用 malloc,您也可以使用私有的、静态分配的内存池。
【讨论】: