这是我的代码:
#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
已经成为一个指针有关,我无法改变这一点,因为我的教授想要这样做。我该如何解决这个问题?
答案 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->size
,p->items[0]
,p->items[1]
等访问这些项目。
在C中你应该not cast malloc,并且通过使用这种模式,你可以避免在sizeof
表达式中命名错误数据类型的错误。
你的struct已经包含了一个DEFAULT_CAPACITY
项的数组,所以我猜你只想要其中一个。如果实际分配了DEFAULT_CAPACITY
个结构的副本,那么你将总共有25个(非连续的)项目。