Почему я не могу динамически выделять память этой строки структуры?

Скажем, например, у меня есть структура:

typedef struct person {
    int id;
    char *name;
} Person;

Почему я не могу сделать следующее:

void function(const char *new_name) {
    Person *human;

    human->name = malloc(strlen(new_name) + 1);
}

person assaf    schedule 11.10.2014    source источник
comment
У вас есть указатель на человека, но вы не выделили новое место для самого человека.   -  person druckermanly    schedule 11.10.2014
comment
@ user2899162: больше похоже на провал внутренней политики, чем на проблему с программированием!   -  person John Zwinck    schedule 11.10.2014


Ответы (2)


Сначала вам нужно выделить место для human:

Person *human = malloc(sizeof *human);

human->name = malloc(strlen(new_name) + 1);
strcpy(human->name, new_name);
person Barmar    schedule 11.10.2014
comment
Разве вы не имеете в виду malloc размер структуры, а не только указатель? @barmar -sizeof(*хуамн - person jim mcnamara; 11.10.2014

Вы должны выделить память для структуры Person. Указатель должен указывать на память, выделенную для структуры. Только после этого вы сможете манипулировать полями данных структуры.

Структура Person содержит id, и char указатель name на имя. Обычно вы хотите выделить память для имени и скопировать в нее данные. В конце программы не забудьте освободить память для name и Person. Порядок выпуска важен.

Представлен небольшой пример программы для иллюстрации концепции:

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

typedef struct person {
    int id;
    char *name;
} Person;


Person * create_human(const char *new_name, int id) 
{
    Person *human = malloc(sizeof(Person));       // memory for the  human

    human->name = malloc(strlen(new_name) + 1);   // memory for the string
    strcpy(human->name, new_name);                // copy the name

    human->id = id;                               // assign the id 

    return human; 
}

int main()
{
    Person *human = create_human("John Smith", 666);

    printf("Human= %s, with id= %d.\n", human->name, human->id);

    // Do not forget to free his name and human 
    free(human->name);
    free(human);

    return 0;
}

Выход:

Human= John Smith, with id= 666.
person sg7    schedule 27.02.2018