c - c 中 malloc() 和 free() 的正确使用

标签 c malloc

我是 C 的新手,所以如果这太明显了,请原谅我,但是我在查找导致段错误的代码中的错误时遇到了问题。我相信问题可能出在 malloc() 的使用上,但我并不乐观。

这是代码:

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

#define         MAX_STRING      20

char*   getFirstName    (char*  firstName
                        )
{
  char* myfirstName = (char*)malloc(strlen(firstName)+1);
  printf("Please enter your first name: ");
  fgets(firstName,MAX_STRING,stdin);
  return(myfirstName);
}


char*   getLastName     (char* lastName
                    )
{
  char* mylastName = (char*)malloc(strlen(lastName)+1);

  printf("Please enter your last name: ");
  fgets(lastName,MAX_STRING,stdin);
  return(mylastName);
}


char*   getNickName     (char*  nickName
                        )
{
  char* mynickName = (char*)malloc(strlen(nickName)+1);
  printf("Please enter your nick name: ");
  fgets(nickName,MAX_STRING,stdin);
  return(mynickName);
}


char*   getCompleteName (const char*    firstName,
                         const char*    lastName,
                         const char*    nickName,
                         char*          completeName
                        )
{
  snprintf(completeName,MAX_STRING,"%s \"%s\"    %s",firstName,nickName,lastName);
}


int     main    ()
{
  char*         firstName;
  char*         lastName;
  char*         nickName;
  char*         completeName;

  firstName     = getFirstName(firstName);
  lastName      = getLastName(lastName);
  nickName      = getNickName(nickName);

  completeName  = getCompleteName(firstName,lastName,nickName,completeName);
  printf("Hello %s.\n",completeName);
 free(firstName);
 free(lastName);
 free(nickName);
 return(EXIT_SUCCESS);
}

我似乎以正确的方式使用 malloc() 吗?

最佳答案

malloc 的首选方式电话是

T *p = malloc( N * sizeof *p );
calloc类似:
T *p = calloc( N, sizeof *p );

强制转换是不必要的,在 C89 下编译器可以掩盖错误。

这个调用的问题
  char* myfirstName = (char*)malloc(strlen(firstName)+1);

firstName参数尚未初始化;它不指向字符串,因此调用 strlen关于它是未定义的。在这种情况下,您应该使用 MAX_STRING常量代替:
char *myFirstName = malloc( (MAX_STRING + 1) * sizeof *myFirstName );

在这种情况下,sizeof *myFirstName是多余的( sizeof (char) 定义为 1 ),但它不会伤害任何东西,如果您决定更改 myFirstName 的类型至 wchar *出于某种疯狂的原因,通话仍将正常工作。

关于c - c 中 malloc() 和 free() 的正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30409474/

相关文章:

c - 使用滚动条调整窗口大小时出现奇怪的效果

c - 如何用c中的复数参数进行计算?

c - 声明带大小的指针和不带大小的指针之间的区别

c - C中文件与文件之间读写的问题

c - C 中嵌套 For 循环的泛化

c - 我如何分配这个结构? (C)

c - 需要有关已中止(核心已转储)的更多信息

c - 在 C 中查找 malloc() 数组长度?

c - 数组作为c中的参数真的是引用类型吗?

c - 为什么 unistd.h execvpe 不能在 macOS 上运行?