c - 将结构中的指针分配给变量

标签 c pointers vector struct pointer-address

这个程序应该创建一个动态内存 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/

相关文章:

c - 'designate an object'在C中是什么意思?

c - 套接字发送()和接收()不工作

c - hping怎么能这么快发包呢?

c++ - 方括号数组和指针数组有什么区别?

c - 声明和访问结构体内部 int 数组的指针

c - 是否可以从给定索引开始在 C 中使用 getLine()?

c - 指针输出结果

c++ - vector.push_back 分配内存失败

c++ - 我怎样才能为立方贝塞尔曲线做这个?

c++ - 相同类型之间的无效转换