【发布时间】:2018-10-09 02:57:29
【问题描述】:
让我们看看下面这段用于将未定义长度的字符串复制到结构中的 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 检查充满了错误。这里有什么问题?
【问题讨论】:
-
你打电话给
malloc(sizeof(nNameStruct*))是错误的。它将为 pointer 分配字节到nNameStruct。你想要sizeof(nNameStruct)。 -
你在
malloc()中的sizeof()是错误的,你想要对象的大小而不是指针,所以sizeof(nNameStruct)和sizeof(char)。sizeof(char)也总是 1,所以根本不需要它。