[英]pointer to struct member
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()并且它返回了正确的值。
谢谢〜麦克斯
我宁愿使用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
返回值。
正如您所陈述的,该示例似乎有问题,因为它实际上可以正常工作。
给出的其他两个答案似乎不正确地集中在bar正在返回局部变量的想法上,但事实并非如此-它返回的字符串是在编译时分配的,而不是在堆栈上动态分配的。 实际上,指向该字符串的指针在技术上可以安全地返回到以后的代码。
我的猜测是您的示例无法准确反映您的实际测试代码。
功能栏中的字符串是局部变量。 您需要通过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;
}
我同意佩里的回答。 常量字符串分配在只读数据段中,而不是堆栈中。 在foo()中,您将返回一个常量字符串,可以从任何位置安全地访问它。
首先,您手动输入了代码。 您没有编译它。 在您的主体中,您有如下代码:
SetFoo(&staticfoo);
printf("%s",staticFoo.C);
您会看到对象staticfoo和staticFoo都不相同。 如果您修复它并运行该程序,则应该打印出字符串。 它印在我的情况下。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.