将结构中的指针指定给变量

时间:2012-07-02 19:08:22

标签: c pointers vector struct pointer-address

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

非常感谢任何见解,谢谢!

3 个答案:

答案 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]
}