2014-09-04 57 views
0

这里是我的代码:typedef'ed struct c,如何访问在typedef中声明为指针的struct实例?

#include <stdio.h> 

#define DEFAULT_CAPACITY 5 

typedef struct Vector 
{ 
    int items[DEFAULT_CAPACITY]; 
    int size; 
} *VectorP; 

// I am not allowed to change this struct definition. 

int main() 
{ 
    VectorP *p; 

    p = (VectorP *) malloc(DEFAULT_CAPACITY * sizeof(VectorP)); 

    if (p == NULL) 
    { 
     fprintf(stderr, "Memory allocation failed!\n"); 
     exit(1); 
    } 

    //The problem is that I can't access instance of the vector this way ->  

    p->size = 0; 
} 

网上搜索,我发现,这是事做VectorP已经是一个指针,因为我的教授希望这样的说法我不能改变这一点。我该如何解决这个问题?

+1

'VectorP'只是'struct Vector *'的别名。所以'VectorP * p'是一个指向'struct Vector'指针的指针。如果你想要一个指向结构的指针,只需使用'VectorP'。 – clcto 2014-09-04 22:27:56

+3

首先,在typedef后面隐藏指针是一个可怕的可怕想法。如果我是你,我只需要使用'struct Vector'和'struct Vector *'。另外,'sizeof(VectorP)'应该是'sizeof(struct Vector)',这样它就可以为向量分配内存,而不仅仅是指针(不正确)。或者甚至更好,为了安全起见,使用'sizeof * p'(以防你的类型改变)。此外,[不要转换'malloc()']的返回值(https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc/605858#605858)。 – 2014-09-04 22:32:40

+0

@BLUEPIXY他大概只想分配一个矢量,而不是一个矢量数组 – clcto 2014-09-04 22:38:48

回答

2

这些线是错误的:

VectorP *p; 
p = (VectorP *) malloc(DEFAULT_CAPACITY * sizeof(VectorP)); 

您需要改用此:

VectorP p; 
p = (VectorP) malloc(DEFAULT_CAPACITY * sizeof(struct Vector)); 

或者,如果你只分配1个Vector对象,而不是多个Vector对象的数组兴趣:

VectorP p; 
p = (VectorP) malloc(sizeof(struct Vector)); 
+3

我个人喜欢'sizeof * p' – clcto 2014-09-04 22:35:17

+0

非常感谢你 – pdhimal1 2014-09-04 22:51:45

+2

并且:不要投malloc()。这是无用的,可能有害。 – wildplasser 2014-09-04 23:46:43

0

看来你的意思是说翼

VectorP p; 

p = (VectorP) malloc(sizeof(*p)); 

p->size = 0; 

如果你想分配结构数组,然后分配看起来像

VectorP p; 

p = (VectorP) malloc(DEFAULT_CAPACITY * sizeof(*p)); 

p->size = 0; 

p = (VectorP) malloc(DEFAULT_CAPACITY * sizeof(*p)); 

p[0].size = 0; 

或者,如果你想真的分配指针数组该结构然后代码将看起来像

VectorP *p; 

p = (VectorP *) malloc(DEFAULT_CAPACITY * sizeof(VectorP)); 

if (p == NULL) 
{ 
    fprintf(stderr, "Memory allocation failed!\n"); 
    exit(1); 
} 

for (int i = 0; i < DEFAULT_CAPACITY; i++) 
{ 
    p[i] = (VectorP) malloc(sizeof(*p[i])); 
} 

p[0]->size = 0; 
+0

'sizeof(* VectorP)'是一个语法错误 – 2014-09-04 23:26:09

+0

@Matt McNabb这是一个错字。应该是sizeof(* p) – 2014-09-04 23:32:16

0

的分配应该是:

VectorP p; 

p = malloc(sizeof *p); 

本作的事情,p点之一,分配足够的空间,不管什么的那是。

然后就可以通过p->sizep->items[0]p->items[1]

访问的项目在C你应该not cast malloc,并且通过使用该图案可以避免命名在sizeof表达错误的数据类型的错误。

你的结构已经包含一个DEFAULT_CAPACITY项的数组,所以我猜你只是想要其中的一个。如果实际分配了DEFAULT_CAPACITY结构的副本,那么总共将有25个(非连续)项目。