Какая разница в использовании переменной в качестве аргумента функции и в прямом использовании строки в качестве аргумента функции? - PullRequest
0 голосов
/ 03 февраля 2020

Я делал какую-то функцию, которая принимает строку в качестве аргумента функции, но

// This is working fine
char string[] = "Any string";
func(string);

//This is not working
func("Any string");

Пожалуйста, скажите мне разницу

Ответы [ 3 ]

2 голосов
/ 03 февраля 2020

Какая разница в использовании переменной в качестве аргумента функции и в прямом использовании строки в качестве аргумента функции?

char string[] = "Any string";
func(string);
// VS.
func("Any string");

string[] - это массив символов, инициализированный с размером и содержимым из "Any string".

"Any string" - это строковый литерал .


Если func() равно func(const char *s), то нет разницы как func() просто читает строку.

Если func() равен func(char *s), но не изменяет строку, указанную s, то нет никакой разницы, так как func() просто читает строку.

Если func() равен func(char *s) и пытается изменить строку, на которую указывает s OP, позже сообщает об этом , тогда func(string) в порядке, так как string является изменяемым символом массив. И все же func("Any string") - это неопределенное поведение (UB). @ John3136 @ Уильям Перселл Код не должен пытаться изменить строковый литерал . Поскольку OP сообщает о первых работах, а 2-й «не работает», это главный подозреваемый.

Для определенности необходимо определение func(), поскольку возможны другие объяснения.

0 голосов
/ 03 февраля 2020

Согласно вашему описанию, похоже, что прототип вашей функции

func(char* str);

ИЛИ

func(char str[]);

Теперь проблема заключается в типе данных String. Когда вы func("Any string"); ожидаете значение указателя (так как массив также работает как указатель), вы присваиваете ему строковое значение, которое определенно вызовет ошибку, поскольку аргументы не совпадают.

Если вы все еще хотите передать строку, используйте это:

str = "Any String";
func(str.toCharArray());
0 голосов
/ 03 февраля 2020

хорошо, так .... Когда вы объявляете "текстовую строку", ее тип:

const char* const text = "text string";

Теперь вы можете скопировать это в буфер символов, так что все в порядке:

char string[] = "Any string";

, потому что «строка» в этом контексте является копией исходного текста (с собственной памятью). Это, однако, не будет хорошо:

char* ptr = "Some Text";

Причина в том, что «Some Text» является постоянным, и вы просите ссылаться на него как на некоторую память, которую можно изменить. Для меня это означает, что у вашего 'fun c' есть следующий прототип:

void func(char* str);

Теперь в приведенном выше примере вы можете передать ему 'string', потому что типы совпадают. Вы не можете передать «Любую строку», потому что она постоянная. Однако, если прототип:

void func(const char* str);

, тогда не должно быть никаких проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...