首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从函数返回字符串但打印为空,原因是什么?

从函数返回字符串但打印为空,原因是什么?
EN

Stack Overflow用户
提问于 2020-11-16 01:07:00
回答 4查看 57关注 0票数 0

我试图从str函数返回一个字符串,但它打印出来(null)

代码语言:javascript
运行
复制
#include
char* str()
{
    char hi[10] = "return this";
    return hi;
}

void main()
{
    printf("%s", str());

}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-11-16 01:22:26

代码语言:javascript
运行
复制
#include
#include
char* str(){
    //malloc is used to allocate memory
    char *hi=(char*)malloc(sizeof(char)*20);
    char ch[]="return this\0";
    for(int i=0;i
票数 -2
EN

Stack Overflow用户

发布于 2020-11-16 01:31:50

在GCC中,至少您的代码编译时会出现以下警告:

代码语言:javascript
运行
复制
main.c:12:19: warning: initializer-string for array of chars is too long                                                                        
main.c:13:12: warning: function returns address of local variable [-Wreturn-local-addr]

这或多或少是对你问题的直接回答。如果您没有收到这些警告,请考虑您正在使用的编译器切换,对于GCC,我建议至少

-这将输出最有用的警告,而不是学究,并使这些警告错误,因此将阻止成功的编译,直到你修复它们。

返回一个指向局部自动变量的指针,该变量在函数返回后不再在作用域中,因此结果未定义。您还尝试使用已保留的更多字符来初始化数组。

编译器在这里所做的是提供了无效的初始化器,它设置了

设置为null,并且

has通过打印来处理空指针

..。这是特定于您的编译器和C库的行为-在其他情况下,可能会发生一些不同的事情。更隐蔽的是,如果您的初始化器不是无效的(通过更短),它很可能具有

出现

你可能从来没有问过这个问题,但它仍然是不正确的,而且在更复杂的代码中,可能会在某些时候导致可观察到的错误行为。

在这种特定情况下,您可以执行以下任一操作:

代码语言:javascript
运行
复制
const char* str()
{
    static const char* hi = "return this";
    return hi;
}
代码语言:javascript
运行
复制
const char* str()
{
    static const char hi[] = "return this";
    return hi;
}
代码语言:javascript
运行
复制
char* str( char* str, int maxlen )
{
    str[maxlen] = '\0' ;
    return strncpy( str, "return this", maxlen - 1 ) ;
}

void main()
{
    char* buffer[32] ;
    printf("%s", str(buffer, sizeof(buffer));
}

最合适的解决方案(上面并不是详尽的)取决于您实际想要做什么,因为每个解决方案在语义上是不同的,而且这个函数本身几乎不实用。它需要一个具体的现实世界的例子来给出最好的建议。

票数 1
EN

Stack Overflow用户

发布于 2020-11-16 01:37:15

阅读

静态变量

或者

全局变量

要在函数外部访问变量,请执行以下操作

您的代码中存在溢出,请阅读

C中的缓冲区溢出

也请阅读

在C和C++中,main()应该返回什么?

代码语言:javascript
运行
复制
#include
char* str()
{
    static char hi[] = "return this";
    return hi;
}

int main()
{
    printf("%s", str());
    return 0;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64847325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档