该程序应该创建一个动态内存向量。我很确定我正确使用malloc。我真正的问题是一些带指针的语法,特别是结构中的指针。
我正在尝试访问结构中的int指针的地址,以便将其分配给另一个指针
我给出的结构是:
typedef struct{
int *items;
int capacity;
int size;
}VectorT;
我想要开始工作的功能是:
int getVector(VectorT *v, int index){
int *p;
p = v->items;//(2)
p -= v->size;
p += index;
return *p;
}
这应该取项目指针的地址减去列表中的项目数,并将所需项目的索引添加到p的地址。然后我返回p。
的地址我非常强烈地认为第(2)行不是我需要的语法。
根据我到目前为止所尝试的内容,我的程序在调用getVector时会崩溃,或者输出(我最好的猜测)一些内存位置。
以下是添加矢量的代码:
void addVector(VectorT *v, int i){
if(v->size >= v->capacity){
//allocate twice as much as old vector and set old pointer to new address
v = (VectorT *) malloc(2 * v->capacity * sizeof(VectorT));
if(v == NULL){
fprintf(stderr, "Memory allocation failed!\n");//error catch
}
else{
v->capacity *= 2;//double the reported capacity variable
v->size++;//add one to the reported size variable
v->items =(int *) i;//add the item to the vector (A)<-----
}
}
else{
v->size++;//add one to the reported size variable
v->items =(int *) i;//add the item to the vector (B)<-----
}
}
我觉得我的问题不在这里,但如果是的话,我对A&amp; A的线路有所怀疑。乙...
非常感谢任何见解,谢谢!
答案 0 :(得分:3)
至少在这些地方处理指针是错误的:
int
覆盖指针。 v->items =(int *) i;
应该是
*(v->items) = i;
您的指针算术不正确:减去大小并添加索引会在分配区域的开头之前得到一个指针,这是不正确的。
您正在将malloc
的结果分配给类型为“指向矢量的指针”的局部变量v
。此赋值对调用者没有影响,因为指针是按值传递的。如果您想在addVector
中重新分配向量,则应该将VectorT **pv
作为第一个参数。此代码片段看起来并不正确:您似乎应该分配v->items=malloc(2 * v->capacity * sizeof(int))
而不是v=malloc(...)
当您执行malloc
时,您不会释放旧向量,从而导致内存泄漏。
答案 1 :(得分:1)
你想要i的地址,因此:
v->items =&i;//add the item to the vector (A)<-----
此外,在计算您想要的尺寸时:
p -= (v->size*sizeof(int));
更新:
您还可以将指向i的指针传递给getVector,并将其保存在v->items
int getVector(VectorT *v, int *index)
//...
v->items = i;
答案 2 :(得分:1)
当你为VectorT.items分配内存时,我看到你正在为VectorT分配内存
void addVector(VectorT *v, int i){
if(v->size >= v->capacity){
//allocate twice as much as old vector and set old pointer to new address
v->items
int* tmp = malloc(2 * v->capacity * sizeof(int));
if(tmp == NULL){
fprintf(stderr, "Memory allocation failed!\n");//error catch
}
else{
int j;
for (j = 0; j < v->size; j++){
tmp[j] = v->items[j];
}
free(v->items);
v->items = tmp;
v->capacity *= 2;//double the reported capacity variable
v->items[v->size] = i;//add the item to the vector (A)<-----
v->size++;//add one to the reported size variable
}
}
else{
v->items[v->size] = i;//add the item to the vector (B)<-----
v->size++;//add one to the reported size variable
}
}
int getVector(VectorT *v, int index){
return v->items[index]
}