typedef' ed struct c,如何访问在typedef中声明为指针的struct实例?

时间:2014-09-04 22:24:08

标签: c pointers vector struct typedef

这是我的代码:

#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已经成为一个指针有关,我无法改变这一点,因为我的教授想要这样做。我该如何解决这个问题?

3 个答案:

答案 0 :(得分: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));

答案 1 :(得分: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;

答案 2 :(得分:0)

分配应该是:

VectorP p;

p = malloc( sizeof *p );

这为p所指向的事物之一分配了足够的空间,无论它是什么。

然后,您可以通过p->sizep->items[0]p->items[1]等访问这些项目。

在C中你应该not cast malloc,并且通过使用这种模式,你可以避免在sizeof表达式中命名错误数据类型的错误。

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