1

该程序应该创建一个动态内存向量。我很确定我正确使用了 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 线和 B 线有些怀疑......

任何见解将不胜感激,谢谢!

4

3 回答 3

3

至少在这些地方,您对指针的处理是错误的:

  • 带有注释“将项目添加到向量”的代码非常错误:它没有添加项目,而是使用任意int.

v->items =(int *) i;

应该

*(v->items) = i;
  • 您的指针算法不正确:减去大小并添加索引将使您在分配区域开始之前获得一个指针,这是不正确的。

  • 您正在将结果分配给“指向向量的指针”类型malloc的局部变量。v这个赋值对调用者没有影响,因为指针是按值传递的。如果您想重新评估 中的向量addVector,您应该将VectorT **pv其作为第一个参数。此代码片段看起来根本不对:看来您应该分配v->items=malloc(2 * v->capacity * sizeof(int))而不是v=malloc(...)

  • 执行 a 时不会释放旧向量malloc,从而导致内存泄漏。

于 2012-07-02T19:19:41.607 回答
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;
于 2012-07-02T19:12:49.190 回答
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]
}
于 2012-07-02T19:38:42.717 回答