Отказ сегментации - символьный указатель

Посмотрите на Извлечение значений определенных свойств , нет необходимости использовать Set для получения различных значений.

6
задан Community 23 May 2017 в 12:17
поделиться

3 ответа

Эти две строки:

char* num = (char*)malloc(100);
num = "123456";

имеют следующий эффект.

Первая выделяет 100 байт и устанавливает num , чтобы указать на эти байты.

Второй изменяет num, чтобы указать на строку «123456», которая почти наверняка находится в постоянной памяти.

Любая попытка изменить содержимое чтения -только память приведет к нарушению сегментации. Вам нужно скопировать строку в malloc 'd num , прежде чем пытаться изменить ее, с помощью:

strcpy (num, "123456");

Это строка, которую вы должны иметь там, где у вас есть:

num = "123456";
17
ответ дан 8 December 2019 в 05:57
поделиться

Используйте

strncpy(num, "123456", 100);

вместо

num = "123456";
4
ответ дан 8 December 2019 в 05:57
поделиться

Согласно ответу Константина.

Вы уже выделили память для num с помощью оператора malloc.

Если бы вы этого не сделали, вам бы сойдет с рук:

char* num = "123456";

Что бы определять и выделять память на лету, но, скорее всего, она будет выделена как константа и, следовательно, доступна только для чтения.

Использование strncpy вместо strcpy для копирования «123456» гарантирует, что любое дополнительное пространство за концом нулевого терминатора строки также будет инициализируется значением null, если вы укажете n как 100 (для вашего примера). В противном случае без инициализации памяти, выделенной malloc, равной нулю (memset (num, 0, 100)), вы можете выйти за пределы конца строки.

О, почти забыл. Рекомендуется использовать strcpy_s или strncpy_s, поскольку они более безопасны, хотя для вашего кода это не имеет значения.

1
ответ дан 8 December 2019 в 05:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: