Как определить объем памяти, необходимый моему char *? - PullRequest
0 голосов
/ 12 сентября 2011

У меня есть эта простая программа, и мне нужно знать, на каком основании я должен выбрать имение для переменной (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 ]

4 голосов
/ 12 сентября 2011

Полагаю, вам следует отложить этот вычет, пока вы не узнаете, что хотите скопировать:

void setName(Emp* emp, char* newName)
{ 
    free(emp->name);
    emp->name = malloc( strlen( newName ) + 1 );
    strcpy(emp->name, newName);
}
0 голосов
/ 12 сентября 2011

Я бы использовал указатели меньше и использовал бы 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...