我做了,像这样的结构:数据结构问题
struct ponto {
int x;
int y;
int z;
};
1)我可以初始化INT与默认值? int var = value;似乎不起作用,编译器说“之前的语法错误='令牌”或类似的东西。
2)我需要像一些结构数组一样工作,但是在读取一个文件之后,我只知道在应用程序启动后需要多少个。我该如何malloc?
在此先感谢
编辑:很多答案,我很感激。可悲的是,我只能标志着一个
我做了,像这样的结构:数据结构问题
struct ponto {
int x;
int y;
int z;
};
1)我可以初始化INT与默认值? int var = value;似乎不起作用,编译器说“之前的语法错误='令牌”或类似的东西。
2)我需要像一些结构数组一样工作,但是在读取一个文件之后,我只知道在应用程序启动后需要多少个。我该如何malloc?
在此先感谢
编辑:很多答案,我很感激。可悲的是,我只能标志着一个
a)您可以用
initalisestruct pronto p = {1,2,3};
在最近的编译器(不知道如何便携本是,认为这是C99?)
b)你可以使用malloc分配数组:
struct pronto *array = malloc(sizeof(struct pronto) * NUMBER);
如果你没有投到'struct ponto *',在C中,你可能会从编译器得到一个警告。在C++中,这根本不会编译。 – 2010-10-29 15:40:39
来自维基百科:“在ANSI C标准下,演员阵容是多余的。” http://en.wikipedia.org/wiki/Malloc – Flexo 2010-10-29 15:45:14
你的回答(一)与C99无关。您将混合初始化与复合文字相混淆。 – 2010-10-29 17:05:06
问题1:如果你需要用一个值来初始化INT:
struct ponto p1;
p1.x = p1.y = p1.z = 3; // initializing with three
另外,如果你想将所有值初始化为0,你可以使用memset
这样的:
memset(&p1, 0, sizeof(struct ponto));
问题2:要使用malloc:
struct ponto *ps;
ps = (struct ponto *)malloc(N*sizeof(struct ponto));
// where N is your element count.
这将人找到内存来存储N
类型的元素struct ponto
。在此之后,你可以用它的初始化值:
int initvalue = 3; // assuming you want to initialize points with value 3
for (i=0; i<N; i++) {
ps[i].x = ps[i].y = ps[i].z = initvalue;
}
You'e制成的结构定义,现在你必须创建一个结构的变量之前,您可以设置字段:
struct ponto xyz;
xyz.x = 7;
要分配足够的空间:
int need_to_have = 24;
struct ponto *pontos = malloc (need_to_have * sizeof(struct ponto));
要initialize your structure members to 0,做到:
struct ponto foo = { 0 };
要malloc()
合适大小的数组,这样做:
struct ponto *arr = (struct ponto *) malloc(COUNT * sizeof(struct ponto));
不要忘记free()
数组时,即可大功告成用它。
+1用于需求使用后释放阵列。一个人不能说经常就够了! – Flinsch 2010-10-29 15:39:13
struct ponto* create_and_init_ponto(int n)
{
struct ponto* array;
int i;
array = (struct ponto*)malloc(n * sizeof(struct ponto));
for (i = 0; i < n; ++i)
{
array[ i ].x = 0;
array[ i ].y = 0;
array[ i ].z = 0;
}
return array;
}
1)你不能给出一个具体的结构,默认值及其在语言级别的元素,因为在C中的所有变量是未初始化的,除非你明确地对它们进行初始化(或使它们的静态/外部在这种情况下,他们零初始化)。如果你设计结构,使得全零是一个很好的初始值组,不过,你总是可以初始化这样的:
struct foo myfoo = {0};
的{0}
作为通用零初始化它适用于任何类型。
如果你需要不同的默认值,最好的办法是使用你的结构必须使用宏使用宏和文档代码:
#define FOO_INITIALIZER { 1, 2, 3 }
struct foo myfoo = FOO_INITIALIZER;
2)如果你知道你开始使用任何结构的前你将需要多少,只是malloc
所有这些,一旦你知道电话号码:
if (count > SIZE_MAX/sizeof *bar) abort();
struct foo *bar = malloc(count * sizeof *bar);
注意调用malloc
,避免溢出漏洞正确的成语。
如果你不知道你需要的数字,直到你开始使用它们,通过分配一个合适的数字开始,如果你用完,增加一个固定的倍数,例如加倍的大小是普遍和容易的。你会想在这里检查溢出。然后使用realloc
。
很多答案,你选择-2投票答案 – 2010-10-31 17:07:30
@fahad:如果我没有检查我的问题,每一天的每一天,我很抱歉。如果我当时选择它,这意味着它可能被大多数人接受,包括我在内。 – Qosmo 2010-11-02 13:36:42
你应该给社会一些时间让他们回顾一下对你和你来说更好的答案。 – 2010-11-02 14:03:42