Тип ц является указателем, а указатели держать адреса - так что вы возвращаете адрес, который имеет указатель.
Пока вы не укажете этот указатель действительным адресом, он указывает на то, кто знает, где, память, которую вы можете или не можете иметь и иметь право доступа. Таким образом, вызов strdup скопирует строку из адреса, содержащегося в p, в какое-то место, которое вы, вероятно, не имеете.
Если вы сначала сделали malloc и дали q результаты malloc, тогда q будет содержать действительный адрес, а ваш strdup поместит копию в память, которую вы сделали (если вы malloc'd достаточно места для строки - strlen on p расскажет вам, сколько вам нужно).
Затем, когда вы вернули q, вы также укажете адресату. Любой код с этим адресом может видеть строку, которую вы там помещаете. Если какой-то будущий код должен был освободить этот адрес, то то, что он держит, находится в воздухе - это может быть что угодно.
Итак, вы не хотите освобождать q до того, как вы вернете адрес, который он держит, - вы должны позволить вызывающему абоненту освободить адрес, который он получает от вас, когда он будет готов.
С точки зрения того, когда вы malloc, да, если вы хотите вернуть адрес, который будет оставаться жизнеспособным после завершения вашей функции, вам необходимо malloc его - чтобы вызывающий вызывал адрес локальной переменной, например, быть плохим: память освобождается, когда функция возвращается, вы ее больше не владеете.
Другое типичное использование malloc - это создание динамических структур данных, таких как деревья и списки, - вы не можете знать, сколько памяти вам нужно спереди, поэтому вы создаете список или дерево, как вам нужно, malloc ' чем больше памяти для каждого узла в структуре.
Ну, посмотрите на вызов 'strcpy'. Он пытается скопировать строку, на которую указывает 'p', в массив, на который указывает' q'. За исключением 'q' не инициализируется, чтобы указывать на массив. Он содержит значение мусора, поэтому вы будете повреждать память, если вы это вызвали. Сначала вам нужно установить 'q' на адрес соответствующего блока хранения, например, что возвращает' malloc'. Только тогда вы сможете написать свою цель. Просто. –
q - адрес, но он не инициализирован. strcpy пытается взять данные и поместить их в место, адресованное q, но q не указывает на что-либо действительное. Вызов malloc (и присвоение результата q) делает q указывать на место, где вы можете поместить данные. –
* Реальная проблема заключается в том, что вам нужно узнать о сроках жизни. К сожалению, большинство учебных пособий обучают только синтаксису, а не важным темам. – o11c