В main
, char *s
инициализируется строковым литералом "hello"
.Это означает, что s
будет указывать на анонимный массив 6 char
, содержащий значения { 'h', 'e', 'l', 'l', o', '\0' }
.Тем не менее, содержимое этого массива не может быть изменено с точки зрения стандарта, поэтому любой код, который записывает в этот массив, демонстрирует неопределенное поведение .
В вызове testing
,параметр char *s
рассматривается как локальная переменная внутри функции.Любое изменение значения указателя не повлияет на переменную char *s
в main
.В вызовах функций C все параметры передаются по значению .
В пределах testing
вы изменяете s
, чтобы указывать на другой строковый литерал "hi"
.Подобно инициализации в main
, testing
s
теперь будет указывать на анонимный массив 3 char
, содержащий значения { 'h', 'i', '\0' }
.Содержимое этого анонимного массива не подлежит изменению.Как упоминалось выше, это не влияет на указатель main
s
.
Вы заявили, что не хотите изменять параметры или возвращать тип какой-либо функции.Для этого testing
потребуется перезаписать содержимое массива, на которое указывает его параметр s
.Поскольку текущий код в main
имеет s
, указывающий на немодифицируемый массив, вам необходимо изменить его, чтобы он указывал на модифицируемый массив.Это можно сделать, изменив main
s
в массив вместо указателя:
int main() {
char s[] = "hello"; // N.B. s[] is 6 chars long including the null terminator
testing(s);
printf("%s\n", s);
} // main
Затем вы можете изменить testing
, чтобы перезаписать содержимое массива, на которое указывает его параметрs
:
#include <string.h>
void testing(char *s) {
strcpy(s, "hi");
} // testing
Я использовал стандартную библиотечную функцию strcpy
в вышеприведенной версии testing
.
Вы должны убедиться, что вы делаетене пишите слишком много char
s в массив, на который указывает s
.
Длина массива s
в main была автоматически установлена на 6 инициализатором "hello" (5 символов плюс aнулевой символ-терминатор).Вы можете установить длину массива в явном виде, если вам нужно перезаписать более 6 char
с, включая нулевой терминатор:
char s[100] = "hello"; // s[100] has space for 99 characters plus a null terminator.