gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:24:37 25 4
gpt4 key购买 nike

我是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com