Возможно, ваш mem->b[num]
не указывает на буфер, достаточно большой для хранения строки.
Возможно, указатель mem->b[num]
не инициализирован вообще, или указатель NULL.
Вы отвечаете за то, что mem->b[num]
указывает на допустимый буфер, который достаточно велик, чтобы содержать строку, которую вы хотите скопировать там, если вы используете strcpy/strncpy - эти функции не «создают» новую строку, они просто копирует байты из одного места в другое, и вам решать, чтобы другое место было допустимой памятью, в которой могут храниться байты.
strncpy
strncpy (мем-> Ь [Num], sourceIds [число] -> источника, STRING_SIZE);
Это копирует все, байт за байтом, вплоть до 0 байт из sourceIds[num]->source
в буфер, который mem->b[num]
указывает.
Затем он заполняет оставшиеся байты mem->b[num]
до STRING_SIZE
с 0 байт.
Примечание:
- если
mem->b[num]
фактически не имеет номер, по крайней мере, STRING_SIZE, strncpy будет копировать данные в конце прошлого mem->b[num]
если sourceIds[num]->source
имеет ровно STRING_SIZE
нет места для в 0 байт в mem->b[num]
, а данные в mem->b[num]
не соответствуют фактической строке. В таком случае вам может понадобиться вручную обрезать строку, иначе другой код, который обрабатывает его как строку, может проходить за ее пределами. Например.do:
mem-> b [num] [STRING_SIZE - 1] = 0;
зЬгсру
зЬгсру (мем-> Ь [Num], sourceIds [число] -> источника);
Это копирует все до сих включительно 0 байт из sourceIds[num]->source
в mem->b[num]
.
- Примечание: если
mem->b[num]
фактически не имеет номера, по крайней мере strlen(sourceIds[num]->source) + 1
, зЬгср будет копировать данные в конце прошлого mem->b[num]
назначение Указателя
mem->b[num]= sourceIds[num]->source;
это просто ЦЕССИОНАРИИ mem->b[num]
, чтобы указать на то, что sourceIds[num]->source
указывает на. Никакая часть строки не копируется. Если вы измените что-либо внутри буфера, на которое указывает sourceIds[num]->source
, вы увидите то же самое при использовании mem->b[num]
, так как они оба указывают на одно и то же.
Мы не можем отлаживать эти 3 строки кода, есть десятки вещей, которые могут привести к их сбою. Можете ли вы как-то понять, если 'mem-> b [num]' указывает на буфер, который достаточно велик, чтобы содержать строку, которую вы хотите скопировать? – nos
Не используйте 'strncpy', пока вы не прочтете свою документацию тщательно и не поймете, что она на самом деле делает. Это не ** «безопасная» замена для «strcpy». –
@PeteBecker: Я бы стал более строгим: НЕ ИСПОЛЬЗУЙТЕ 'strncpy'. Внимательно прочитайте его документацию и посмотрите, что он на самом деле делает. Это не «безопасная» замена для «strcpy», она громоздка и подвержена ошибкам, всегда есть лучшая альтернатива. – chqrlie