我的设备可以是“路由器”或“交换机”。我使用下面的函数,传递一个枚举,返回我的字符串。我的问题是whoami的内存是在堆栈上分配的。当此函数devicetype_string完成时,堆栈将被销毁。当我使用指向堆栈上分配的内存的指针时,这不会导致问题吗?
目前的代码有效。我只想了解为什么它的工作原理。我认为更清洁和可移植的解决方案是使用malloc内存来保存whoami(以便它进入堆)并且调用函数应该释放该内存。
这是目前的计划:
char *devicetype_string (FwdrType devicetype)
{
char *whoami;
switch (devicetype)
{
case FWDR_TYPE__ROUTER:
whoami = "Router";
break;
case FWDR_TYPE__SWITCH:
whoami = "Switch";
break;
default:
whoami = "Fwder Type UNKNOWN";
}
return whoami;
}
foo()
{
. . .
FwderType abc = FWDR_TYPE__ROUTER;
printf ("%s", devicetype_string(abc));
}
答案 0 :(得分:7)
这不是内存泄漏,也不是未定义的行为。
在函数devicetype_string
中,whoami
指向所有路径中的字符串文字。字符串文字具有静态存储持续时间,不需要释放它们。
答案 1 :(得分:2)
它的工作原理是你返回一个指向静态字符串的指针,这个字符串没有在堆栈上创建 - 它们具有静态存储持续时间,这意味着它们在程序的持续时间内有效。 / p>
需要注意的其他事项:
字符串文字通常存储在只读数据部分中。尝试将可写char*
分配给字符串文字,这可能是只读的(可能是因为存储文字的位置实际上是特定于平台的)然后修改内容会触发未定义的行为,通常是分段错误(尝试修改只读数据部分)。
GCC将无法编译,不允许将可写的char*
分配给字符串文字。
更好的实现不是分配您的char*
指针,而只是将字符串文字的地址作为const char*
const char *devicetype_string (FwdrType devicetype)
{
switch (devicetype)
{
case FWDR_TYPE__ROUTER: return "Router";
case FWDR_TYPE__SWITCH: return "Switch";
default: break;
}
return "Fwder Type UNKNOWN";
}