一系列指针问题

时间:2014-07-14 15:29:26

标签: c arrays pointers

在将数据从一个指针传递到结构的指针数组元素时,我遇到了一些麻烦。

typedef struct {

    float* data;
    int size;

} vector;

//This function creates the vector

vector* doVector(int n, float* data){

    vector * vec = (vector *) malloc(sizeof(vector));
    vec->size = n;
    vec->data = data;

    return vec;
}

void delVector(vector* v){

    free(v->data);
    free(v);
}

void prVector(vector* v)
{

    printf("[");
    for(unsigned int i = 0; i<v->size; i++){
        if(i!=v->size-1)
            printf("%f,", v->data[i]);
        else
            printf("%f]\n", v->data[i]);
    }

}

void fillVectors(float* data,int size){

    vector * vectors = (vector*) malloc(size * sizeof(vector));
    for(unsigned int i = 0; i < size; i++){
        vectors[i] = *doVector(size,data);//This gives trouble
        prVector(&vectors[i]);
    }

    //More stuff will be added here to work with the vectors.

    for(unsigned int i = 0; i < size; i++) 
        delVector(&vectors[i]);//Memory leak here obv

    free(vectors);// I also need to free the array

}

int main()
{

    //Here recieving data from file and calling fillVectors

    //Also allocating memory for data (which is send to fillvectors)

    //Avoided to post because it's irrelevant and big

}

因此,主要思想是使用struct创建向量,从文件中读取Data和size并将其存储到名为data和int size的float数组中。然后我们调用函数fillVector,它将调用doVector函数并创建向量本身。

然后我想将每个向量的值分配给指针数组的位置(有3个malloc,数据和单个向量,它们是在doVector中创建的,以及在fillVectors中生成的向量数组)。

解决这个问题时出现问题,不断发生内存泄漏。 与向量数组的malloc和doVector的向量malloc有关。

ps:fillVector函数只调用一次

感谢。

3 个答案:

答案 0 :(得分:2)

简单规则:在C中如果要在函数发送指针中处理smth。因此,如果想通过指针删除向量,则将指针传递给指针

void delVector(vector** v){
    free((*v)->data);
    free(*v);
    *v = NULL;
}

函数已经返回指针,因此不需要使用星号。

vectors[i] = *doVector(size,data);

第二:你想要一组矢量?所以使用指向矢量的指针数组

vector **vectors = (vector**) malloc(size * sizeof(vector*));
for (unsigned int i = 0; i < size; i++){
    vectors[i] = doVector(size, data);//This gives trouble
    prVector(vectors[i]);//no need to use ampersand, it is already pointer
}

主要:你需要向量中的浮点数据的深层复制。现在所有向量都保持指向同一数组的指针,作为参数给出。除此之外,您删除此数据

free(v->data);

但是这个指针被复制了,但没有被拥有。

vector* doVector(size_t n, float* data){
    size_t i;
    vector * vec = (vector *) malloc(sizeof(vector));
    vec->size = n;

    vec->data = (float*)malloc(sizeof(float) * n);
    for (i = 0; i < n; i++) {
        vec->data[i] = data[i];
    }
    //or just
    //memcpy(vec->data, data, n*sizeof(float));

    return vec;
}

更多问题......

答案 1 :(得分:0)

您应该初始化所有创建的指针,而不是IMMEDIATELY分配给NULL或0或(void *)0。然后,对free的调用将清理所有已分配的数据。

每当分配实际数据类型时,请确保在分配之前将内部ptr设置为NULL。

C

vector* newVector;
newVector = (void*)0; //or 0, NULL
... //Code here
newVector = malloc(sizeof(vector));
newVector->data = (void*)0;
... //More code

if(!newVector){
    free(newVector);
    newVector = (void*)0;
}

备注

如果必须进行动态内存分配,请以管理具有静态值的指针的格式进行。

正如Chris在下面提到的,删除空ptr已经由delete和free处理了,但我喜欢包含if语句来提醒自己在绝对必要时将指针设置为NULL。

再次感谢Chris:D

答案 2 :(得分:0)

我将专注于评论//This gives trouble

使用函数doVector,您可以使用malloc在内存中的某个位置创建一个矢量实例。然后,在通过执行*doVector(size, data)取消引用结果时,您将获取创建的向量并尝试将其分配给vectors[i]。这会将新创建的矢量的内存块复制到vectors[i]位置,但不会将指针保留为doVector的结果。

之后,您在for循环中释放vectors逐个元素的内存,稍后您尝试在for循环后使用free(vectors)再次释放相同的空间。但是,doVector内分配的内存永远不会被释放,因为你没有指向创建向量的指针。

为了使其正确,我会坚持Ivan Ivanov的答案。我只是想指出为什么它不起作用。