分配在一个结构的指针的变量(Assigning a pointer in a struct to a

2019-09-18 23:54发布

这项计划是为了建立一个动态存储载体。 我敢肯定,我在正确使用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的一些怀疑...

任何有识之士将不胜感激,谢谢!

Answer 1:

你的交易的指针是错误的,至少这些地方:

  • 该注释代码“的项目添加到载体”是非常错误的:不是增加一个项目,它覆盖一个任意指针int

v->items =(int *) i;

应该

*(v->items) = i;
  • 您的指针运算是不正确的:减去的尺寸和添加索引会得到你之前分配的区域,这是不正确的开始的指针。

  • 您正在分配结果malloc一个局部变量v型“指针矢量”。 这种分配在调用者没有影响,因为指针是按值传递。 如果你想重新assing向量在addVector ,你应该采取VectorT **pv作为第一个参数。 此代码片段不看的权利都:看来,你应该分配v->items=malloc(2 * v->capacity * sizeof(int)) ,而不是v=malloc(...)

  • 你不释放旧矢量当你做一个malloc ,造成内存泄漏。



Answer 2:

你想,我的地址,因此:

v->items =&i;//add the item to the vector (A)<-----

此外,计算大小的时候,你会想:

p -= (v->size*sizeof(int));

更新:

您也可以将指针传递给我到getVector,只是保存在v->items

 int getVector(VectorT *v, int *index)
 //...
 v->items = i;


Answer 3:

我明白你的VectorT分配内存时,你应该为VectorT.items来分配内存

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


文章来源: Assigning a pointer in a struct to a variable