Внутри магистральный вы объявили массив
char src[40]="hello";
Когда вы передаете массив в функции
str(src);
он превращается во временный объект, который является указателем на первый элемент массива. Параметр функции является локальной переменной функции, которая уничтожается после выхода из функции.
Вы можете себе представить вызов функции и его определение следующим образом
str(src);
char* str(void)
{
char * s = &src[0]
s = "readers";
return s;
}
То есть сначала этой локальной переменной (я переименовал его, как с, что отличить его от исходного массива), назначенного на адрес первый элемент массива, а затем переназначил адрес первого элемента строкового литерала. И адрес этого первого элемента строкового литерала возвращается из функции. Локальная переменная (то есть параметр функции) уничтожается после выхода из функции.
Эти операции не влияют на исходный массив. Все время вы обрабатывали локальную переменную s внутри функции.
Если вы хотите, чтобы строковый литерал был скопирован в исходном массиве, вы должны использовать стандартную функцию C strcpy
, объявленную в заголовке <string.h>
. Например
#include <string.h>
//...
char* str(char *s)
{
strcpy(s, "readers");
return s;
}
В этом случае исходный массив будет изменен, потому что в функции strcpy
там используется указатель на его первый элемент, который s
Так строка символов копируется в область, на которую указывает указатель, который находится в массив.
Учитывайте, что в массивах нет оператора присваивания. Вы можете инициализировать массив следующим образом
char src[40] = "hello";
, но вы не можете написать после определения массива следующий оператор присваивания
src = "hello";
Вы должны скопировать массивы поэлементно, как, например, для символьных массивов, содержат строки с помощью стандартной функции strcpy
'return src;' не влияет на код, который вы предоставили. И один вопрос за один раз, пожалуйста! FYI, в фрагменте кода нет никаких указателей на функции. –
Это было бы менее запутанным, если бы вы использовали другое имя для параметра функции, чем для массива в 'main'. –