strcpy
копирует определенную строку в выделенную память.Присвоение указателей на самом деле не копирует строку, а просто устанавливает для второй переменной указателя то же значение, что и для первого.
strcpy(char *destination, char *source);
копирует из источника в место назначения, пока функция не найдет '\ 0'.Эта функция небезопасна и не должна использоваться - попробуйте strncpy
или strlcpy
.Вы можете найти полезную информацию об этих двух функциях в https://linux.die.net/man/3/strncpy - проверьте, где будет выполняться ваш код, чтобы помочь вам выбрать лучший вариант.
В вашем блоке кода у вас есть это объявление
char *strings[10],string[50],*p;
Здесь объявляются три указателя, но они совершенно разные.*p
- обычный указатель, и для него должно быть выделено пространство (через malloc
), прежде чем вы сможете его использовать.string[50]
также является указателем, но длиной 50 (символы, обычно 1 байт) - и он размещается непосредственно в стеке функций, так что вы можете использовать его сразу (хотя самое первое его использование должноОбнулять память, если вы не использовали распределитель обнуления, такой как calloc
в Solaris. Наконец, *strings[10]
- это указатель double - вы выделили массив из 10 указателей, каждый элемент которого(strings[1]
, strings[9]
и т. Д.) Должны быть выделены для использования перед использованием.
Единственный из тех, кому вы можете назначить немедленно, это string
, потому что пространство уже выделено. Каждый из этих указателейможет быть решена с помощью подписки - но в каждом случае вы должны убедиться, что вы не ушли с конца, иначе вы столкнетесь с «нарушением сегментации» SIGSEGV, и ваша программа будет аварийно завершена.просто странные результаты.
Наконец, выделенные указатели должны быть освобождены вручную, иначе у вас будут утечки памяти. Элементы, выделенные в стеке (string
) освобождать не нужно, потому что компилятор обрабатывает это после завершения функции.