无法通过函数返回值打印字符串?

时间:2017-04-13 12:50:18

标签: c string printf return-value function-calls

#include <string.h>
#include <stdio.h> 

char *in() { 
    char a[10]; 
    scanf("%s",a); 
    return (a); 
} 

int main () { 
    char *a; a=in(); 
    printf("\n%s",a); 
    return (0); 
}

2 个答案:

答案 0 :(得分:3)

在您的代码中,

 return (a);

是尝试返回局部变量的地址。在呼叫者中,地址的任何使用(尝试访问)都将导致undefined behavior,因为内存地址无效

函数返回后,函数内的局部变量将不复存在,其生命周期到期。因此,与这些变量(对象)对应的地址变为无效。根据{{​​1}},章节§6.2.4

  

[...]如果在其生命周期之外引用对象,则行为未定义。当指针指向(或刚刚过去)的对象到达其生命周期的末尾时,指针的值变得不确定。

注意:那就是说,我的个人添加:: C11是一个关键字,请不要让它看起来像一个函数。

解决方案:您需要确保返回地址的变量的生命周期取代函数范围,这样您就可以

  • 使用return和系列来分配内存
  • 使用malloc()存储的变量。

答案 1 :(得分:0)

不要返回局部变量指针。使用全局代替或静态。

char *in() { 
    static char a[10]; 
    scanf("%s",a); 
    return (a); 
} 

int main () { 
    char *a; a=in(); 
    printf("\n%s",a); 
    return (0); 
}