#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <iostream>
using namespace std;
char a[21]; // If this is put inside the function unter -> junk output
char* b="";
void unter()
{
char *new_str = "";
strcpy(a, new_str);
char str_temp[10]="";
int chnum =0, neighbor1=3, neighbor2=5, mynode=4;
sprintf(str_temp,"%d",chnum);
b = strcat(a, str_temp);
b = strcat(b, "_from");
sprintf(str_temp,"%d",mynode);
b = strcat(b, str_temp);
b = strcat(b, "to");
sprintf(str_temp,"%d",neighbor1);
b = strcat(b, str_temp);
}
int main()
{
unter();
cout << a;
cout << b;
std::cin.get();
}
这是我在C ++中的代码。我不确定字符数组'a'是如何与'b'具有相同的值。而且,当我宣布'a'
时char a[21];
在内部函数unter()中,我得到了'b'的一些垃圾值(作为输出)。小心解释如何?
答案 0 :(得分:3)
b = strcat(a, str_temp);
可能是导致你的问题的原因,因为strcat()的返回值是传递给它的第一个参数,因此你看到a
和b
变得相等的原因,因为{该通话中{1}}已设置为b
。
答案 1 :(得分:3)
a
是一个char数组,b
是一个指向a
的指针,因此在打印它们时,它们总是打印相同的东西。当您将a
的声明移动到unter
时,它会在unter
返回时被销毁,留下b
一个dnagling指针,因此在打印时会出现垃圾。
答案 2 :(得分:2)
strcat()返回连接操作的结果,所以
b = strcat(a, str_temp);
导致b指向数组a []。随后的strcat()操作实际上也是如此,因此最终结果是b指向[]。如果在unter()中声明一个[],它将具有该函数的局部作用域,结果是在退出对unter()的调用后,全局变量b将指向随机/未定义的内存内容。
值得注意的是,您正在做很多可以通过
轻松完成的工作。sprintf(a, "%d_from%dto%d", chnum, mynode, neighbor1);
答案 3 :(得分:2)
您可以在一行中完成整个连接和sprintf。
char* b="";
void unter()
{
int chnum =0, neighbor1=3, neighbor2=5, mynode=4;
char str_temp[21];
sprintf(str_temp,"%d_from%dto%d", chnum, mynode, neighbor1);
b = new char[strlen(str_temp)+1];
b = strcpy(b, str_temp);
}
有趣的是你必须记得在完成后删除b。另一个选择是直接使用a buffer和sprintf:
char a[21];
void unter()
{
int chnum =0, neighbor1=3, neighbor2=5, mynode=4;
char str_temp[21];
sprintf(a,"%d_from%dto%d", chnum, mynode, neighbor1);
}
答案 4 :(得分:1)
除了提供的其他提示外,您还应注意
行b = strcat(b, str_temp);
似乎对b不合适只是被定义为指向单字节存储的char指针(“”定义一个空字符串,即一个包含'0'的单个元素的字符数组)
因此,当strcat附加到b时,它会创建一个缓冲区溢出。
编辑:实际上我只是注意到b被指定为指向a,(感谢前面提到的那一行),这样就可以了,因为可能有空间......但是,需要两个变量没有意义。
也许你不明白的是,虽然strcat()返回一个指针,但这个返回不需要“消耗”,这只是一个方便,因为当我们链接命令时。换句话说,你可以简单地写:
strcat(a, str_temp);
不需要任何字符* b。
答案 5 :(得分:1)
在函数内部定义a
时,变量a
的内存在堆栈上分配。函数退出时会破坏此内存。指针b
指向a
的起始地址。现在,如果您尝试在函数外部访问b
,它将指向已经被破坏并包含垃圾值的内存位置。基本上,b
变成了悬空指针。
答案 6 :(得分:1)
如果在a
函数中声明unter()
,那么它仅限于该函数内部。尝试从函数外部打印b
将打印垃圾,因为它指向已被销毁的a
。
这是一个典型的例子,说明为什么你总是要确保不要指向全局变量。