gpt4 book ai didi

c - 从不同文件访问静态数组的 'strdup'

转载 作者:行者123 更新时间:2023-11-30 15:37:49 24 4
gpt4 key购买 nike

我在线程函数中使用下面的 get_sessionid() 函数,然后尝试释放该指针。

static char sessionid[SESSIONID_LEN] = { '\0' };

static void generate_sessionid() {
char set[] = "0123456789"
"abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int len;

memset(sessionid, 0, sizeof(char) * SESSIONID_LEN);
for (len = 0; len < SESSIONID_LEN; len++) {
size_t index = (double) rand()/RAND_MAX*(sizeof(set) - 1);
sessionid[len] = set[index];
}
}

char *get_sessionid() {
if (strlen(sessionid) == 0) generate_sessionid();
return strdup(sessionid);
}

当我调试调用上述 get_sessionid 的线程函数时,我注意到返回的 session ID 不为 NULL,但程序立即崩溃并显示 SIGABRT当我尝试释放该指针时。我也不会双重释放指针,这会引发中止信号。我不确定线程​​安全是否是这里的问题。

线程函数也是在不同的文件中定义的。

编辑:

我按照建议进行了更改:

static char sessionid[SESSIONID_LEN+1] = { '\0' };

此编辑后我仍然收到 SIGABRT。

另一件事要提:我在其他机器上没有收到此信号,但仅在运行 Debian Squeeze 的一台特定机器上收到此信号(Linux 内核:2.6.32-5-amd64)

编辑2:

从不同的线程函数中,尝试访问 get_sessionid() 返回的指针时会引发段错误:SIGSEGV。此错误会在所有机器上抛出(与之前的错误不同)并且是可重现的。当我调试并尝试在调用线程函数中打印返回指针的值时,我得到:

<Address 0xfffffffffc005080 out of bounds>

最佳答案

您应该将sessionid定义为

static char sessionid[SESSIONID_LEN+1] = { '\0' };

然后之后

for (len = 0; len < SESSIONID_LEN; len++) {

sessionid 仍然是一个有效的 C 字符串(字符序列和“\0”),这是 strdup() 所需要的。

关于c - 从不同文件访问静态数组的 'strdup',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22058352/

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