Язык C: выделение памяти структуры двух указателей char * - PullRequest
0 голосов
/ 01 июня 2018

Мне нужно выделить структуру из двух указателей на символ, как показано ниже:

typedef struct message_s {
    char* message;
    char* sender_id; 
} message_t;

"message" будет указателем на символ [] из 246 байтов;

"sender_id "будет указателем на символ [] из 3 байтов;

Как правильно распределить память для типа message_t?Пока что мое решение следующее, но похоже, что оно не работает.

message_t* msg = NULL;
char* a_message = (char*)malloc((size_t)246);
a_message = /*read the string somewhere*/
char* id = (char*)malloc((size_t)3);
id = /*read the string somewhere*/
msg->message = a_message;
msg->sender_id = id;

Это приводит к ошибке сегментации.Могу ли я выделить память для message_t?Как?

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Ваш псевдокод имеет утечек памяти , например,

char* a_message = (char*)malloc((size_t)246);
a_message = /*read the string somewhere*/

Это перезапишет указатель a_message, поэтому он больше не будет указывать на память, зарезервированную malloc()в предыдущей строке.Поэтому вы никогда не сможете free() этой памяти.

Из всего, что показано в вашем вопросе, нет никакой причины использовать указатели вообще.Вы можете просто объявить свою структуру следующим образом:

typedef struct message
{
    char message[246];
    char sender_id[3];
} message;

и выделить ее целиком так:

message *msg = malloc(sizeof *msg);

Перед использованием убедитесь, что msg не NULL, malloc() может произойти сбой ...


С помощью указателей вы должны выделить три отдельных блока:

typedef struct message
{
    char *message;
    char *sender_id;
} message;

// ...

// no error checking here for brevity, add the checks yourself:
message *msg = malloc(sizeof *msg);
msg->message = malloc(246);
msg->sender_id = malloc(3);
0 голосов
/ 01 июня 2018

Указатели «a_message» и «id» указывают на память, которая уже выделена.По сути, указатель - это аргумент, который хранит адрес памяти с некоторым типом данных.Но msg это NULL, то есть msg указывает на недопустимый пробел.Поэтому, когда вы хотите дать msg-> message значение, программа пытается получить доступ к недопустимому добавлению.Вот почему сегмент неисправен.Чтобы решить эту проблему, вы должны предоставить msg допустимое пространство для хранения msg-> message и msg-> sender_id.Вот почему "message_t * msg = malloc (sizeof (message_t));"необходимо.

0 голосов
/ 01 июня 2018
message_t* msg = malloc(sizeof(message_t));

Или просто разместить его в стеке:

message_t msg;
...