将char []转换为char *

时间:2010-04-19 09:04:44

标签: c++ c

可能这是一个嘶嘶声的问题,但请帮忙

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

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

这里是如何使用printf(“%s”,cc);

打印Hello

7 个答案:

答案 0 :(得分: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 :(得分:1)

您正在返回本地变量的地址,该地址变量利用未定义的行为。您需要在a内设置static Called或全局,或为其分配内存。

并使用%s作为printf

的格式

答案 2 :(得分: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());                                                                                                                               
}  

答案 3 :(得分:0)

2件事

  • 您需要%s,字符串格式说明符才能打印字符串。

  • 您正在返回本地数组变量a [6]的地址,它将在函数返回后被销毁。该程序应该给你一个分段错误。你应该崩溃了。如果你在linux机器上做ulimit -c unlimited,然后运行程序。您应该看到核心转储。

答案 4 :(得分:0)

%c用于打印单个字符。您需要使用%s来打印以空字符结尾的字符串。也就是说,当您尝试从函数a返回局部变量Called的地址时,此代码可能会崩溃。一旦返回Called,就会释放此变量内存。你试图使用这个释放的内存是Caller,在大多数情况下它会崩溃。

答案 5 :(得分:0)

少数事情:

  • return &a;更改为return a;
  • 您要返回的地址 local数组将不复存在 一旦函数return..so分配 它会动态使用new或将其设为static
  • %s中使用printf格式说明符代替%c

答案 6 :(得分:0)

问题1 :%c是单个字符的说明符,而您需要使用%s,这是字符串的格式说明符(指向NUL的指针) - 终止的字符数组)。

问题2 :在 Called 中,您返回一个指向char(char **)指针的指针: a 本身被认为是指向数组第一个元素的指针,因此在返回时不需要那个&符号。

问题3 :即使您更正了其他两个错误,代码中也存在一个主要缺陷:您正在尝试返回指向本地对象的指针(数组 a < / em>),将在超出范围时被破坏(例如,当Called将返回时)。所以调用者将有一个指针指向一个不再专用于a的内存区域;接下来发生的是未定义的行为:它可能会工作一段时间,直到存储 a 的内存不用于其他内容(例如,如果在使用返回之前没有调用其他函数)价值),但很可能会在应用程序的第一次变化时悲惨地爆炸。

在C中返回字符串的正确方法是使用malloc或calloc在堆上分配它们,并将此指针返回给调用者,调用者将有责任在不再需要它时释放它。在C中执行它的另一种常见方法是将局部变量声明为静态,因此它不会在返回时被破坏,但这将使您的函数不可重入既不是线程安全的(并且它也可能会给出其他令人讨厌的问题)。

另一方面,由于您使用的是C ++,处理字符串的最佳方法是std::string class,它具有良好的复制语义,因此您可以将其作为正常返回值返回,而无需考虑范围考虑。

顺便说一下,如果你需要返回的字符串总是相同的,你可以将函数的返回类型声明为const char *并直接返回字符串,如

const char * Test()
{
    return "Test";
}

这是有效的,因为字符串“Test”由编译器放在一个固定的内存位置,它将在所有执行期间保留。它需要是const char *,因为允许编译器对需要“Test”字符串的每个其他程序说,并且因为应用程序的所有字符串都紧密包装在那里,所以如果你试图让那个字符串更长,你会覆盖其他字符串。

但是,在我看来,如果你正在做我所概述的那些错误,可能是你正在尝试为你现有的技能做一些有点过于复杂的事情:如果再看看你的C ++可能会更好手册,特别是关于指针和字符串的章节。