2010-10-29 68 views
3

我做了,像这样的结构:数据结构问题

struct ponto { 
    int x; 
    int y; 
    int z; 
}; 

1)我可以初始化INT与默认值? int var = value;似乎不起作用,编译器说“之前的语法错误='令牌”或类似的东西。

2)我需要像一些结构数组一样工作,但是在读取一个文件之后,我只知道在应用程序启动后需要多少个。我该如何malloc?

在此先感谢

编辑:很多答案,我很感激。可悲的是,我只能标志着一个

+0

很多答案,你选择-2投票答案 – 2010-10-31 17:07:30

+0

@fahad:如果我没有检查我的问题,每一天的每一天,我很抱歉。如果我当时选择它,这意味着它可能被大多数人接受,包括我在内。 – Qosmo 2010-11-02 13:36:42

+0

你应该给社会一些时间让他们回顾一下对你和你来说更好的答案。 – 2010-11-02 14:03:42

回答

2

a)您可以用

initalise
struct pronto p = {1,2,3}; 

在最近的编译器(不知道如何便携本是,认为这是C99?)

b)你可以使用malloc分配数组:

struct pronto *array = malloc(sizeof(struct pronto) * NUMBER); 
+0

如果你没有投到'struct ponto *',在C中,你可能会从编译器得到一个警告。在C++中,这根本不会编译。 – 2010-10-29 15:40:39

+1

来自维基百科:“在ANSI C标准下,演员阵容是多余的。” http://en.wikipedia.org/wiki/Malloc – Flexo 2010-10-29 15:45:14

+0

你的回答(一)与C99无关。您将混合初始化与复合文字相混淆。 – 2010-10-29 17:05:06

-3

问题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; 
} 
+2

我虽然从虚空铸造*就像在C被认为是坏形式? – Flexo 2010-10-29 15:36:37

+0

@awoodland:为什么?在C中用'void *'投掷什么是好方法? – 2010-10-29 15:38:51

+3

你不需要从C++中的void *转换为struct pronto *,尽管你会用C++。我可能在这里是错误的,但我认为不写(多余)演员的理由是因为它没有对正确的代码做任何有用的事情,它唯一能做的就是将问题隐藏在不正确的代码中。 (例如在一些其他的例子中意外抛出const) – Flexo 2010-10-29 15:42:51

0

You'e制成的结构定义,现在你必须创建一个结构的变量之前,您可以设置字段:

struct ponto xyz; 
xyz.x = 7; 

要分配足够的空间:

int need_to_have = 24; 
struct ponto *pontos = malloc (need_to_have * sizeof(struct ponto)); 
0
  1. 你不能有“默认“结构成员的价值。空间未分配给结构定义。你只是创建一个新的类型(如内置的int)。当你实际定义一个类型为ponto的变量时,空间将被分配给它。

  2. 您可以对您需要多少人进行有根据的猜测,为这些人分配空间(使用malloc)然后继续。如果您发现达到极限,则可以使用realloc函数调整阵列大小。

1

initialize your structure members to 0,做到:

struct ponto foo = { 0 }; 

malloc()合适大小的数组,这样做:

struct ponto *arr = (struct ponto *) malloc(COUNT * sizeof(struct ponto)); 

不要忘记free()数组时,即可大功告成用它。

+3

+1用于需求使用后释放阵列。一个人不能说经常就够了! – Flinsch 2010-10-29 15:39:13

1
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; 
} 
0

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