gpt4 book ai didi

c - 在函数中返回字符串

转载 作者:太空宇宙 更新时间:2023-11-04 06:35:56 24 4
gpt4 key购买 nike

gcc 4.7.2
c89

你好,

我有一个函数可以根据 channel 的当前状态返回一个字符串。我只是想知道使用什么更好的技术。首先我使用一个内存池,这样内存就永远有效。第二个只是在 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;
}

返回语句中的字符串

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;
}

最佳答案

在返回语句中返回字符串将字符串文字分配给本地指针.. 是相同的解决方案。 使用传入的内存池更容易出错,除非您更改函数原型(prototype)以返回const char*

在第三个选项中,您将“CHANNEL_IDLE”文字的地址分配给指针类型的局部变量,该变量进一步按值返回。因此,原始地址被返回,无论堆栈如何,它都保持有效(见下面的解释)。选项三与 return 0xffffaaaa;

相同

在整个代码中定义的字符串文字将被链接器仔细清除并重新定位到单个代码部分。根据您的平台,运行时加载程序实际上可以将其放入只读存储器中,并且写访问可以生成硬件中止。选项一使返回的字符串修改可行,因为它的副本将位于堆中。从您的使用示例来看,我怀疑您想要修改字符串,因此“strdup”开销是不必要的。

由于选项二和选项三相同,我会更改函数原型(prototype)以返回类型为 const char* 并选择其中一个。

附言“我们应该忘记小效率,大约 97% 的时间说:过早优化是万恶之源”D. Knuth

关于c - 在函数中返回字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15019589/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com