奇怪的malloc崩溃

  • 本文关键字:崩溃 malloc malloc
  • 更新时间 :
  • 英文 :


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

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的一切似乎都很好。

EDIT:进一步的调查使我相信是早期对malloc的调用把这个搞砸了。这样的事情可能吗?如果我取消在set_some_struct之前进行的函数调用的注释,并且涉及几个mallocs,那么set_some_struct将正常运行。

当分配失败时,你所做的就是打印一个错误;也许是打印掉了,或者你没打印?如果有多个线程运行此命令,输出可能会令人困惑。

第二,您没有检查输入指针。由于崩溃是一次读操作,而所有其他通过指针进行的访问都是对新分配的区域进行写操作,因此我怀疑其中一个或多个参数是NULL指针。你应该检查一下。

同样,你不应该在C中强制转换malloc() 的返回值(原因见这里),如果你不包括stdlib.h,这可能隐藏错误。

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

if (some_struct_ptr == NULL)
    printf("malloc failed!n");

从这一点开始,您正在使用垃圾指针。下面的代码也会出现同样的问题。

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

相关内容

  • 没有找到相关文章

最新更新