内存泄漏char * C程序

时间:2018-04-28 12:04:20

标签: c string char malloc

让我们看一下用于将未定义长度的字符串复制到结构中的以下C代码:

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

typedef struct nNameStruct{
  char* nName;
  //char* nName2;
} nNameStruct;

nNameStruct * NameCreate(char *buffer) {
  nNameStruct *pNew;
  pNew = (nNameStruct*) malloc(sizeof(nNameStruct*));
  pNew->nName = (char*) malloc((strlen(buffer)+1)*sizeof(char*));
  strcpy(pNew->nName,buffer);
  //pNew->nName2 = (char*) malloc((strlen(buffer)+1)*sizeof(char*));
  //strcpy(pNew->nName2,buffer);
  return pNew;
}

int main() {
  nNameStruct *newName;
  char buffer[]="Trial string";

  newName=NameCreate(buffer);
  printf("%s\n",newName->nName);
  //printf("%s\n",newName->nName2);

  free(newName->nName);
  //free(newName->nName2);
  free(newName);
  return 0;
}

这个程序运行得很好。但是,如果我想分配另一个字符串(使用注释行),我有内存泄漏问题,valgrind检查充满了错误。这有什么问题?

1 个答案:

答案 0 :(得分:3)

这一行存在问题:

pNew = (nNameStruct*) malloc(sizeof(nNameStruct*));

它应该是sizeof(nNameStruct)。当struct包含单个指针时,nNameStruct *和nNameStruct的大小可能相同,当struct中有两个指针需要分配更多时。