Но при этом ничего не выводится и нет ошибки. Что пошло не так?
des
больше не указывает на начало строки после выполнения (*des++ = *src++)
. Фактически, des
указывает на один элемент за символом NUL
, который после этого завершает строку.
Таким образом, если вы хотите напечатать строку с помощью printf("%s\n",des)
, он вызывает неопределенное поведение.
Вам необходимо сохранить адресное значение «начального» указателя (указывающего на первый char
объект выделенного фрагмента памяти) во временный указатель «держателя». Возможны разные способы.
#include <stdio.h>
#include <stdlib.h>
int main (void) {
char *des = malloc(sizeof(char) * 10);
if (!des)
{
fputs("Error at allocation!", stderr);
return 1;
}
char *tmp = des;
for (const char *src = "abcdef"; (*des++ = *src++) ; );
des = temp;
printf("%s\n",des);
free(des);
}
Альтернативы:
#include <stdio.h>
#include <stdlib.h>
int main (void) {
char *des = malloc(sizeof(char) * 10);
if (!des)
{
fputs("Error at allocation!", stderr);
return 1;
}
char *tmp = des;
for (const char *src = "abcdef"; (*des++ = *src++) ; );
printf("%s\n", tmp);
free(tmp);
}
или
#include <stdio.h>
#include <stdlib.h>
int main (void) {
char *des = malloc(sizeof(char) * 10);
if (!des)
{
fputs("Error at allocation!", stderr);
return 1;
}
char *tmp = des;
for (const char *src = "abcdef"; (*tmp++ = *src++) ; );
printf("%s\n", des);
free(des);
}
Примечания:
"abcdef\0"
- Явное \0
не требуется. Он добавляется автоматически во время перевода. Используйте "abcdef"
.
Всегда проверяйте возврат функции управления памятью, если выделение выполнено успешно, проверяя возвращенный указатель на нулевой указатель.
Укажите указатели на строковый литерал с помощью const
, чтобы избежать непреднамеренных попыток записи.
Используйте sizeof(char) * 10
вместо простого 10
в вызове mallo c. Это гарантирует размер записи при изменении типа.
int main (void)
вместо int main (void)
. Первый соответствует стандарту, второй - нет.
Всегда free()
динамически выделяемая память, поскольку вам больше не нужна выделенная память. В приведенном выше примере это будет избыточным, но если ваша программа станет больше, а пример сфокусирован частично, вы должны немедленно free()
ненужную память.