2015-04-11 2 views
1

Моя программа:Почему не меняется `src`, когда я меняю его на функцию?

#include<stdio.h> 
#include<conio.h> 

char* str(char*src);\\declared as function global 
main() 
{ 
    char src[40]="hello"; 
    clrscr(); 
    puts(src); 
    str(src);\\ function called 
    puts(src);\\does not put changed string? 
    getch(); 
    return 0; 
} 

char* str(char *src) 
{ 
    src="readers";\\changing my source string<--is it changes??? 
    return src;\\returning source sting 
} 

выход:

hello 
hello 

Почему src не становится "readers"?

+0

'return src;' не влияет на код, который вы предоставили. И один вопрос за один раз, пожалуйста! FYI, в фрагменте кода нет никаких указателей на функции. –

+0

Это было бы менее запутанным, если бы вы использовали другое имя для параметра функции, чем для массива в 'main'. –

ответ

3

В вашем коде src="readers"; неверен. Вы должны попробовать, как

strcpy(src, "readers"); 

Причина заключается в том, C использует передачу по значению при прохождении параметров функции. Итак, src здесь передается по значению, поэтому вы не можете изменить src изнутри функции. Вы можете изменить функцию *src. Итак, чтобы изменить содержимое, указанное src, вы должны использовать strcpy().

Кроме того, как г-н, @coolguy упомянул, что вы не используете возвращаемое значение str(), поэтому return заявление не делает никакого влияния здесь.

0

Давайте посмотрим на код, не так ли?

str(src); 

Функция вызывается с параметром src. Адрес первого элемента массива src передается функции str.

char* str(char *src) 

В этой функции, src является указателем, который указывает на адрес первого элемента src (массив) в main.

src="readers"; 

Вы меняете место, где src указывает и делает его точку в строку буквального "readers". Это не влияет на массив src в main.

return src; 

Возвращает указатель src. В фрагменте кода, который вы указали, он не имеет никакого эффекта.

То, что вы на самом деле хотите,

strcpy(src,"readers"); 

вместо

src="readers"; 

Прежние копирует строку "readers" в src и его последующие байты, и это изменяет содержимое массива src в main.
Последний делает указатель src указывает на новый строковый литерал "readers".

2

Внутри магистральный вы объявили массив

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

Смежные вопросы