Ошибка сегментации при сохранении значений внутри структуры из другой структуры с использованием C - PullRequest
1 голос
/ 25 августа 2011

У меня есть две структуры

typedef struct profile_datagram_t
{
    unsigned char *src;
    unsigned char *dst;
    unsigned char ver;
    unsigned char n;
    struct profile_t profiles[MAXPROFILES];
} header;

header outObj;

struct pearson_record
{
    unsigned char *src;
};

Теперь я хочу записать значение внутри outObj.src в беззнаковый символ * src struct pearson_record.

Как это сделать ?? Любой пример или любая помощь будут очень полезны. Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 25 августа 2011

Предполагая, что outObj.src указывает на действительную память, которая содержит строку с нулевым символом в конце:

struct person_record x;
x.src = malloc(strlen(outObj.src) + 1);  // +1 for the null terminator!
strcpy(x.src, outObj.src);               // could have used strncpy as well
1 голос
/ 25 августа 2011

Важно понимать, что struct содержат указатели на строки символов; они не содержат пробелов для самих строк символов. Вы не можете использовать memcpy(), потому что нет никакой целевой памяти для копирования. Один из способов сделать это - использовать strdup():

header h;
struct pearson_record p;
p.src = "the source";
h.src = strdup(p.src);
0 голосов
/ 25 августа 2011

Когда вы создали outObj или экземпляр pearson_record, у вас есть указатели, которые ни на что не указывают.Вы должны заставить их указывать на некоторый буфер в памяти перед их использованием.

outObj.src = malloc(length);
// do something with outObj.src

struct pearson_record prec;
prec.src = malloc(length);
memcpy(prec.src, outObj.src, length);

// do something with them

// free memory allocated by malloc
free(outObj.src);
free(prec.src);

, где length - длина данных.

0 голосов
/ 25 августа 2011
outObj.src = (unsigned char *)malloc(10 * sizeof(char));
pearson_record = (unsigned char *)malloc(10 * sizeof(char));
memcpy(pearson_record.src, outObj.src, 10);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...