这个程序应该创建一个动态内存 vector 。我很确定我正确使用了 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 时崩溃,要么输出(我最好的猜测)一些内存位置。
这是添加 vector 的代码:
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 和 B 行有些怀疑......
任何见解将不胜感激,谢谢!
最佳答案
至少在这些地方你对指针的处理是错误的:
- 带有注释“将项目添加到 vector ”的代码是非常错误的:它没有添加项目,而是用任意
int
覆盖了指针。
v->items =(int *) i;
应该是
*(v->items) = i;
您的指针算法不正确:减去大小并添加索引将使您获得分配区域开头之前的指针,这是不正确的。
您正在将
malloc
的结果分配给类型为“pointer to vector”的局部变量v
。这个赋值对调用者没有影响,因为指针是按值传递的。如果您想在addVector
中重新评估 vector ,您应该将VectorT **pv
作为第一个参数。此代码片段看起来根本不正确:您似乎应该分配v->items=malloc(2 * v->capacity * sizeof(int))
而不是v= malloc(...)
当您执行
malloc
时,您没有释放旧 vector ,导致内存泄漏。
关于c - 将结构中的指针分配给变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11299723/