指向struct成员的指针

时间:2012-03-01 17:41:47

标签: c linux pointers gcc struct

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

4 个答案:

答案 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都不相同。如果你修复它并运行程序,你应该打印字符串。它打印在我的情况下。