通过函数C malloc / free的char指针

时间:2018-03-08 14:12:11

标签: c function pointers malloc free

我已阅读这些链接:link1link2

但是,如果我在valgrind中执行以下代码:

valgrind --tool=memcheck --leak-check=full --num-callers=40 --show-possibly-lost=no

我可以看到内存未正确释放。

#include <stdio.h>
#include <stdlib.h> 

void printVector(char ** vector, int N);
void allocateVector(char *** vector, int N, int M);
void deallocateVector(char *** vector, int N);

int main(int argc, char * argv[]) { 
    char ** vector;
    int N=6;
    int M=200;
    allocateVector(&vector,N,M);
    printVector(vector,N);
    deallocateVector(&vector,N);    
}

void allocateVector(char *** vector, int N, int M) {
    *vector=(char **) malloc(N*sizeof(char *));
    int i;
    for(i=0; i<N; i++) {
        (*vector)[i]=(char *) malloc(M*sizeof(char));
        (*vector)[i]="Empty";
    }
}

void deallocateVector(char *** vector, int N) {
    int i;
    char ** temp=*vector;
    for(i=0; i<N; i++) {
        if(temp[i]!=NULL) {
            free(temp[i]);
        }
    }
    if(temp!=NULL) {
        free(temp);
    }
    *vector=NULL;
}

我无法找到错误的位置。

1 个答案:

答案 0 :(得分:3)

问题在于:

for(i=0; i<N; i++) {
    (*vector)[i]=(char *) malloc(M*sizeof(char));
    (*vector)[i]="Empty";
}

您在(*vector)[i]中分配空间并存储指向它的指针。然后用字符串常量"Empty"的地址覆盖该指针。

这会导致两个问题:

  • malloc返回的内存被泄露,因为您不再引用它。
  • 当您稍后调用free时,您将传递字符串常量的地址而不是已分配的内存块的地址。以这种方式呼叫free会调用undefined behavior

您需要使用strcpy函数将字符串常量复制到您分配的内存中:

for(i=0; i<N; i++) {
    (*vector)[i]=malloc(M);
    strcpy((*vector)[i],"Empty");
}

此外,don't cast the return value of mallocsizeof(char)定义为1,可以省略。