gpt4 book ai didi

c - 奇怪的 malloc 崩溃

转载 作者:行者123 更新时间:2023-12-04 10:13:39 27 4
gpt4 key购买 nike

我有以下代码在过去的几个月里一直在工作,但最近有时会崩溃(在多线程应用程序中运行时):

struct some_struct {
char* m_str1;
char* m_str2;
}

struct some_struct*
set_some_struct(const char* p_str1, const char* p_str2) {
struct some_struct* some_struct_ptr =
(struct some_struct*)malloc(sizeof(struct some_struct));
if (some_struct_ptr == NULL)
printf("malloc failed!\n");

size_t str1_len = strlen(p_str1) + 1;
size_t str2_len = strlen(p_str2) + 1;

some_struct_ptr->m_str1 = malloc(str1_len);
if (some_struct_ptr->m_str1 == NULL)
printf("malloc failed!\n");

some_struct_ptr->m_str2 = malloc(str2_len); // Crashes here
if (some_struct_ptr->m_str2 == NULL)
printf("malloc failed!\n");

strcpy(some_struct_ptr->m_str1, p_str1);
strcpy(some_struct_ptr->m_str2, p_str2);

return some_struct_ptr;
}

运行它给我““0x7c81bb52”处的指令引用了“0x00000002”处的内存。无法“读取”内存。

上面的代码在某些情况下是否有明显的错误?如果我在测试程序中单独运行该函数,它工作得很好,但在完整的应用程序中运行时它总是崩溃。导致第三个 malloc 的一切似乎都很好。

编辑: 进一步的调查让我相信是之前对 malloc 的调用把这件事搞砸了。这样的事情甚至可能吗?如果我取消注释在 set_some_struct 之前进行的函数调用并且涉及多个 mallocs 那么 set_some_struct 将运行得很好。

最佳答案

好吧,当分配失败时,您所做的就是打印错误;也许打印丢失了或者你遗漏了它?如果有多个线程运行它,输出可能会令人困惑。

其次,您没有检查输入 指针。由于崩溃是一次读取,并且所有其他通过指针的访问都是写入您新分配的区域,我怀疑一个或多个参数是 NULL指针。你应该检查一下。

此外,您不应该转换 <code>malloc()</code> 的返回值在 C ( see here for reasons ) 中,如果您不包括 stdlib.h这可能隐藏了错误。

如果字符串是常量,您可以通过一次调用 malloc() 来节省内存和速度。 ,当然,首先将三个分配的大小相加,然后相应地设置指针。

关于c - 奇怪的 malloc 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14376967/

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