2010-04-19 2 views

ответ

0

2 вещи

  • Вам нужно% с, формат строки спецификатор для печати строк.

  • Вы возвращаете адрес локальной переменной массива a [6], он будет уничтожен после возвращения функции. Программа должна давать вам ошибку сегментации. Вы должны получить сбой. Если вы работаете на Linux-машине, то ulimit -c неограниченно, а затем запустите программу. Вы должны увидеть дамп ядра.

+0

Я дал% s только, но и не работает – Sijith

+0

Вы можете уточнить, что вы пытаетесь научиться с этим. Может быть, мы сможем помочь лучше, если мы это знаем, спасибо – Jasmeet

1

Вы возвращаете адрес локальной переменной, которая использует неопределенное поведение. Вы должны сделать astatic внутри Called или глобально, или выделить для него память.

И использовать %s как формат для printf

4

Во-первых, эта функция:

char *Temp1::Called() 
{ 
char a[6]="Hello"; 
return &a; 
} 

возвращает локальную переменную, которая перестанет существовать после того, как функция заканчивается - изменение:

const char *Temp1::Called() 
{ 
return "Hello"; 
} 

, а затем, чтобы напечатать строки с использованием printf(), следует использовать «% s»:

void Temp1::caller() 
{ 
const char *cc=Called(); 
printf("sdfasfasfas"); 
printf("%s",cc); 
} 
+1

В таком случае указатели должны быть 'const char *' (избегать устаревшего преобразования). – visitor

+0

@visitor Хорошая точка - изменен. – 2010-04-19 12:48:28

0

%c предназначен для печати одного символа. Вы должны использовать %s для печати нулевой строки. Тем не менее, этот код может сбой, поскольку вы пытаетесь вернуть адрес локальной переменной a из функции Called. Эта переменная память освобождается, как только возвращается Called. Вы пытаетесь использовать эту выпущенную память: Caller, и в большинстве случаев она выйдет из строя.

0

Немногие вещи:

  • Изменить return &a; в return a;
  • Вы возвращаете адрес local массив, который прекратит свое существование когда функции return..so выделить динамически с помощью new или сделайте это static.
  • использование %s спецификатор формата в printf вместо %c
+0

Я изменил тогда и ту же ситуацию. Код нарушает – Sijith

+0

Обновите сообщение, добавив изменения, которые вы сделали, и ошибку/сбой, который вы видите. – codaddict

0

Проблема 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++, особенно в главе о указателях и строках.

1

char a [6] - локальная переменная, и вы не можете вернуть ее из функции. Он будет уничтожен, когда ваш код выйдет за рамки.

Вы можете использовать STL фот это:

#include <stdio.h>                                    
#include <string>                                    
using namespace std;                                  
string Called()                                    
{                                       
    string a=string("Hello");                                
    return a;                                    
}                                       

int main()                                     
{                                       
    string cc=Called();                                  
    printf("sdfasfasfas\n");                                
    printf("%s",cc.c_str());                                
} 
Смежные вопросы