typedef struct
{
int A;
int B;
char* C; // problem is here
}foo;
int SetA(void)
{
....
return retval;
}
int SetB(void)
{
....
return retval;
}
const char* bar(void)
{
.....
char* retval="return val";
.....
return retval;
}
void SetFoo(foo* paramFoo)
{
paramFoo->A = SetA();
paramFoo->B = SetB();
paramFoo->C = bar();
}
static foo staticFoo;
void main()
{
SetFoo(&staticFoo);
printf("%s",staticFoo.C);// printing
}
一切都会顺利但是struct foo中的“char * C”写得不好。为什么?我需要知道我是否犯了错误以及它是多么正确吗?我已经运行了bar()并返回了正确的值。
谢谢 ~Max
答案 0 :(得分:3)
我更喜欢使用malloc
及更晚free
,因此我不必担心只读字符串文字何时被销毁。
const char* bar(void)
{
const char* retval="return val";
char * value = malloc( strlen(retval) + 1 ); // +1 for the termination
// character
strcpy( value, retval );
retrun value ;
}
请记住,free
不再需要时返回值。
答案 1 :(得分:2)
正如你所说的那样,这个例子似乎有些错误,因为它实际上应该有效。
给出的其他几个答案似乎不准确地关注bar返回局部变量的想法,但事实并非如此 - 它返回的字符串是在编译时分配的,而不是在堆栈上动态分配的。事实上,指向所述字符串的指针在技术上可以安全地返回到以后的代码。
我的猜测是,您的示例并不能准确反映您的实际测试代码。
答案 2 :(得分:0)
功能栏中的字符串是局部变量。你需要通过malloc创建一个内存缓冲区或者将它声明为一个全局变量。
char* bar(void)
{
char* retval=malloc(100*sizeof(char)); //malloc the buffer
strcpy( retval,"return val");
retrun retval ;
}
或
char * str = "return val";
const char* bar(void)
{
.....
char* retval = str;
.....
return retval;
}
答案 3 :(得分:0)
我同意佩里的回答。常量字符串在只读数据部分中分配,而不是在堆栈上。在foo()中,您将返回一个常量字符串,可以从任何位置安全地访问它。
首先,您手动输入了代码。你没有编译它。在你的主要你有这样的代码:
SetFoo(&staticfoo);
printf("%s",staticFoo.C);
您看到对象staticfoo和staticFoo都不相同。如果你修复它并运行程序,你应该打印字符串。它打印在我的情况下。