C++ 输出未显示
问题是当输出本应显示hi时,却没有显示输出。我只是想知道为什么会发生这个错误C++ 输出未显示,c++,C++,问题是当输出本应显示hi时,却没有显示输出。我只是想知道为什么会发生这个错误 char * a() { char * c; char b[10]; b[0] = 'h'; b[1] = 'i'; b[2] = '\0'; for (int i = 0; b[i] != '\0'; i++) c[i] = b[i]; return c; } int main() { char * d; d = a
char * a()
{
char * c;
char b[10];
b[0] = 'h';
b[1] = 'i';
b[2] = '\0';
for (int i = 0; b[i] != '\0'; i++)
c[i] = b[i];
return c;
}
int main()
{
char * d;
d = a();
cout << d;
}
char*a()
{
char*c;
charb[10];
b[0]=“h”;
b[1]=“i”;
b[2]='\0';
对于(int i=0;b[i]!='\0';i++)
c[i]=b[i];
返回c;
}
int main()
{
char*d;
d=a();
cout您的程序中有几个错误。请注意,您创建了char类型的指针,然后执行如下操作:
c[i]
这将导致错误。这不是您想要做的。
阿尔索
您不应该返回指向局部变量的指针/引用。局部变量离开作用域时会被销毁(在您的示例中,b在“return c;”处被销毁)。
所以,当您创建指向本地对象的指针(注意,您的变量是在堆栈上创建的,而不是在堆上创建的)并从函数返回时,您的指针指向被破坏的内存。它可能工作,但可能不工作(未定义的行为)但是你不应该做这样的事情。当你想要一个数组时,你需要为项目分配空间。仅仅一个指针是不够的。比如
char* c= new char[10]; //room for 10 chars
确保不要尝试索引大于10-1=9。访问c[10]
是未定义的行为
您可以返回该指针(returnc;
),但不要忘记在不再需要时释放分配的内存
d = a();
cout << d;
delete [] d; //free memory allocated with new d[...]
d=a();
函数在一个未初始化的指针上写下,并破坏随机内存。如果编译器发出警告消息,这就是为什么你不应该忽略编译器中的警告消息,即使它仍然编译程序。如果编译器没有警告消息,也许你需要更好的C++。编译器。我没有收到任何警告。我在全局中定义了char*c,并尝试了这段代码,即使它不起作用。我现在想知道,我如何在不使用关键字string的情况下返回string元素,并将其存储在调用返回函数的char*中。“我没有收到任何警告”-然后你需要提高警告级别并将其视为错误。我在global中定义了char b[10],这样它就不会被破坏。即使在那时它也不起作用。我现在想知道,我如何在不使用关键字string的情况下返回string元素,并将其存储在调用返回函数的char*中。“string element”字母或符号是正确的吗?像“A”?或者你想返回,让我们说“某事”,但不是字符串,而是指向乞丐的字符指针?这是你想要实现的吗?当然这不是最好的解决方案,但是我想确保我们在同一页面上(即,如果你使用C++ +>=11,你就应该避免使用OVIN指针(使用新创建的))。,请改用智能指针!。在您的示例中,只返回std::string就可以了。有一种称为SSO(小字符串优化)的方法可以提高代码的效率。请相信您的编译器:D