我有这个简单的程序,需要知道我应该在哪个基础上为变量(howToPredectThisNumber
)选择(即char*
字符串的大小)。
在这种情况下,最好选择哪个char[]
或char*
??
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct
{
char* name;
}Emp;
void init(Emp** emp)
{
int howToPredectThisNumber = 50;
*emp = malloc(sizeof(Emp));
(*emp)->name = NULL;
(*emp)->name = calloc(howToPredectThisNumber, sizeof(char*));
}
void release(Emp** emp)
{
free((*emp)->name);
free(*emp);
}
void setName(Emp* emp, char* newName)
{
strcpy(emp->name, newName);
}
char* getName(Emp* emp)
{
return emp->name;
}
int main(void)
{
Emp* emp;
init(&emp);
setName(emp, "Muhammad Abdullah");
printf("%s", getName(emp));
release(&emp);
return 0;
}
答案 0 :(得分:4)
我想你应该推迟扣除,直到你知道要复制的内容:
void setName(Emp* emp, char* newName)
{
free(emp->name);
emp->name = malloc( strlen( newName ) + 1 );
strcpy(emp->name, newName);
}
答案 1 :(得分:0)
我会更少使用指针并使用strdup而不是malloc + strlen + strcpy作为它的用途。
更好的解决方案是认识到Emp对名称无效,并确保在创建时提供。如果您忘记提供名称,则在运行时不会编译而不会导致分段错误。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct {
char* name;
} Emp;
Emp *create(char * name) {
Emp *emp = (Emp *) malloc(sizeof (Emp));
emp->name = strdup(name);
return emp;
}
void release(Emp* emp) {
free(emp->name);
free(emp);
}
void setName(Emp* emp, char* newName) {
free(emp->name);
emp->name = strdup(newName);
}
char* getName(Emp* emp) {
return emp->name;
}
int main(int argc, char** argv) {
Emp* emp = create("Muhammad Abdullah");
printf("%s", getName(emp));
release(emp);
return (EXIT_SUCCESS);
}