繁体   English   中英

指向结构成员的指针

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM