2012-03-01 129 views
0
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”不会被正确写入。为什么?我需要知道我是否犯错,以及如何纠正它?我已经跑了吧(),它返回正确的值。指向结构成员的指针

谢谢 〜最大

+0

请修复格式 – Matteo 2012-03-01 17:44:59

+1

你是什么意思“写得不好”。你怎么知道 ? – cnicutar 2012-03-01 17:46:14

+0

@cnicutar没有什么会被写入,当我尝试印刷它时,它不会给我任何东西。 – 2012-03-01 17:48:55

回答

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不再需要时的返回值。

+0

谢谢,这很有帮助。 – 2012-03-01 18:28:07

+0

我很好奇 - 这究竟是如何解决问题的?问题是指针分配? – 2012-03-01 18:39:07

+0

@DrewDormann我认为在SetFoo()中使用它之前,只读字符串(retval in bar)被破坏了,所以动态内存分配(malloc)是不错的选择,因为我可以在任何时候销毁它(免费)。 – 2012-03-01 18:58:43

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; 
} 
2

东西出现你说的,因为它实际上应该努力是错误的例子。

几个其他答案给出的似乎关于bar返回一个局部变量的想法,但它不是 - 它返回的字符串是在编译时分配的,并且不在堆栈上动态分配。实际上,返回到后面的代码在技术上是安全的。

我的猜测是你的例子不是你的实际测试代码的准确反映。

0

我同意佩里的答案。常量字符串分配在只读数据段中,而不是在堆栈中。在foo()中,你返回一个常量字符串,它可以从任何地方安全地访问。

首先,您手动输入了代码。你没有编译它。在你的主体中你有这样的代码:

SetFoo(&staticfoo); 
    printf("%s",staticFoo.C); 

你看到,对象staticfoo和staticFoo都不相同。如果你修复它并运行程序,你应该得到打印的字符串。它打印在我的情况。