我试图从str函数返回一个字符串,但它打印出来(null)
#include
char* str()
{
char hi[10] = "return this";
return hi;
}
void main()
{
printf("%s", str());
}
发布于 2020-11-16 01:22:26
#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
发布于 2020-11-16 01:31:50
在GCC中,至少您的代码编译时会出现以下警告:
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库的行为-在其他情况下,可能会发生一些不同的事情。更隐蔽的是,如果您的初始化器不是无效的(通过更短),它很可能具有
出现
你可能从来没有问过这个问题,但它仍然是不正确的,而且在更复杂的代码中,可能会在某些时候导致可观察到的错误行为。
在这种特定情况下,您可以执行以下任一操作:
const char* str()
{
static const char* hi = "return this";
return hi;
}
const char* str()
{
static const char hi[] = "return this";
return hi;
}
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));
}
最合适的解决方案(上面并不是详尽的)取决于您实际想要做什么,因为每个解决方案在语义上是不同的,而且这个函数本身几乎不实用。它需要一个具体的现实世界的例子来给出最好的建议。
发布于 2020-11-16 01:37:15
阅读
静态变量
或者
全局变量
要在函数外部访问变量,请执行以下操作
您的代码中存在溢出,请阅读
C中的缓冲区溢出
也请阅读
在C和C++中,main()应该返回什么?
#include
char* str()
{
static char hi[] = "return this";
return hi;
}
int main()
{
printf("%s", str());
return 0;
}
https://stackoverflow.com/questions/64847325
复制相似问题