如何确定我的char *所需的内存量?

时间:2011-09-12 08:59:04

标签: c memory-management

我有这个简单的程序,需要知道我应该在哪个基础上为变量(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;
}

2 个答案:

答案 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);
}