【问题标题】:Memory leak char* C program内存泄漏 char* C 程序
【发布时间】: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,所以根本不需要它。

标签: c string char malloc


【解决方案1】:

这行有问题:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 2021-04-17
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    相关资源
    最近更新 更多