让我们看一下用于将未定义长度的字符串复制到结构中的以下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检查充满了错误。这有什么问题?
答案 0 :(得分:3)
这一行存在问题:
pNew = (nNameStruct*) malloc(sizeof(nNameStruct*));
它应该是sizeof(nNameStruct)。当struct包含单个指针时,nNameStruct *和nNameStruct的大小可能相同,当struct中有两个指针需要分配更多时。