Проблема 1:% С является спецификатор для одного полукокса, в то время как вам нужно использовать% S, который является спецификатором формата для strings (указатели на массив символов NUL-terminated).
Задача 2: в Called вы возвращаете указатель на указатель на символ (полукокса **): сам считается указателем на первый элемент массива, так что вы не» t нужно, чтобы амперсанд вернулся.
Проблема 3: даже если вы исправили две другие ошибки, есть большой недостаток в вашем коде: вы пытаетесь вернуть указатель на локальный объект (массив ), который будет разрушается, когда он выйдет из области действия (например, когда Called вернется). Таким образом, у вызывающего есть указатель на область памяти, которая больше не предназначена для; что происходит дальше, это неопределенное поведение: он может работать некоторое время, пока память, в которой хранится a, не используется для чего-то еще (например, если вы не вызываете другие функции перед использованием возвращаемого значения), но большинство вероятно, будет тратиться трагически при первом изменении приложения.
Правильный метод возврата строк в C выделяет их в куче с помощью malloc или calloc и возвращает этот указатель на вызывающего, который будет обязан освободить его, когда он больше не понадобится. Другой распространенный способ сделать это на C - объявить локальную переменную как статическую, поэтому она не будет разрушена при возврате, но это сделает вашу функцию не реентерабельной ни поточно-безопасной (и она также может дать другие неприятные проблемы).
С другой стороны, поскольку вы используете C++, лучший способ справиться со строками - это std::string class, который имеет приятную семантику для копирования, чтобы вы могли вернуть его как нормальное возвращаемое значение, не беспокоясь о соображениях области.
Кстати, если строка вам нужно возвратить всегда то же самое, вы можете просто объявить тип возвращаемого значения вашей функции, как const char *
и вернуться непосредственно строку, как и в
const char * Test()
{
return "Test";
}
Это работает, потому что строка «Test» помещается компилятором в фиксированную ячейку памяти, где она будет оставаться во время всего выполнения. Он должен быть const char *
, потому что компилятору разрешено говорить любой другой части программы, для которой требуется строка «Тест», чтобы посмотреть там, и потому, что все строки приложения плотно упакованы там, поэтому, если вы попытались сделать в этой строке вы должны переписать еще одну строку.
По-моему, если вы делаете ошибки, подобные тем, которые я изложил, возможно, вы пытаетесь сделать что-то слишком сложное для своих текущих навыков: если может быть лучше иметь другой взгляд на ваш C++, особенно в главе о указателях и строках.
Я дал% s только, но и не работает – Sijith
Вы можете уточнить, что вы пытаетесь научиться с этим. Может быть, мы сможем помочь лучше, если мы это знаем, спасибо – Jasmeet