gcc 4.7.2
c89
你好,
我有一个函数,它将根据通道的当前状态返回一个字符串。我只是想知道使用什么更好的技术。第一个我使用内存池,以便内存始终有效。第二个只是在 return 语句中返回一个字符串。第三个使用在堆栈上分配的本地指针并返回它。
在所有情况下,我只是打印字符串,不会将其用于其他任何事情。
你会推荐哪一个?
非常感谢您的任何建议,
使用这样的功能:
MODULE_LOG(PRIO_DEBUG, "%s|%s",
g_channel_state_to_string(channel->previous_state, channel->mem_pool),
g_channel_state_to_string(channel->current_state, channel->mem_pool));
使用传入的内存池
static char* g_channel_state_to_string(states_e state, apr_pool_t *mem_pool)
{
char *channel_state = NULL;
switch(state) {
case CHANNEL_IDLE:
channel_state = apr_pstrdup(mem_pool, "CHANNEL_IDLE");
break;
default:
channel_state = apr_pstrdup(mem_pool, "CHANNEL_UNKNOWN_CHANNEL_STATE");
break;
}
return channel_state;
}
在 return 语句中返回字符串
static char* g_channel_state_to_string(states_e state)
{
switch(state) {
case CHANNEL_IDLE:
return "CHANNEL_IDLE";
break;
default:
return "CHANNEL_UNKNOWN_CHANNEL_STATE";
break;
}
}
将字符串文字分配给本地指针可能会导致堆栈转储,因为内存是在堆栈上分配的,并且在函数返回时可能不存在。
static char* g_channel_state_to_string(states_e state)
{
char *channel_state = NULL;
switch(state) {
case CHANNEL_IDLE:
channel_state = "CHANNEL_IDLE";
break;
default:
channel_state = "CHANNEL_UNKNOWN_CHANNEL_STATE";
break;
}
return channel_state;
}