未知段错误

Unknown Segfault

在此先感谢您的帮助。我已经完成了我可以尝试调试的所有研究。添加 printf 似乎会改变段错误发生的位置。我对 gdb 几乎不熟悉,但不知何故 运行 程序没有问题。我遇到了一些量子观察问题。让我们进入代码。

这只是为了重新认识 C。段错误发生在 create_string() 的某处。我永远无法让 printf() 在 set_string(str, src); 调用之前出现。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    char* value;
    size_t mlength;
    size_t length;
} StringContainer;

typedef struct {
    StringContainer* value;
    StringContainer* next;
} StringContainerList;


void set_string(StringContainer *str, const char* src);
StringContainer* create_string(const size_t max_length, const char* src);
size_t string_length(StringContainer* str);

int main(int argc, char *argv[])
{
    StringContainer* str = create_string(100, "The quick brown fox jumped over the lazy dog.");

    printf("Test: string_length\n");
    printf("%zu\n", string_length(str));
    return 0;
}

StringContainer* create_string(const size_t max_length, const char* src)
{
    StringContainer* str;
    size_t str_len;

    if ( src == NULL )
    {
        str_len = 0;
    }
    else
    {
        str_len = strlen(src);
    }

    str = (StringContainer*)malloc(sizeof(StringContainer));

    str->mlength = max_length;

    if ( str_len > 0 )
    {
        // set_string will delayed-malloc str->value :)
        set_string(str, src);
    }

    return str;
}

void set_string(StringContainer* str, const char* src)
{
    if (str->value == NULL)
    {
        str->value = (char*)malloc(str->mlength * sizeof(char));
        memset(str->value, '[=10=]', str->mlength);
    }

    strcpy(str->value, src);

    str->length = strlen(str->value);
}

size_t string_length(StringContainer* str)
{
    char* value = str->value;
    size_t max_length = str->mlength;
    size_t offset_idx = 0;
    size_t division = max_length / 2;

    while (division != 0)
    {
        if ( value[offset_idx + division] != '[=10=]' )
        {
            offset_idx = offset_idx + division;
        }

        division /= 2;
    }

    return offset_idx;
}

感谢大家的宝贵时间。我确信它很简单,可能是基本的东西,但我的 Google-foo 还不够发达,无法找到问题的根源。

另外,这种设计模式常见吗?显然,malloc 应该与 free 相关联。我还将添加检查 malloc 是否成功。

create_string() 函数中,您应该正确设置 malloced str 的值,使其不包含任何随机值。

特别是str->value没有设置为NULL。然后你在 set_string() 中检查它可能不会成功,你会 strcpy() 到未分配的内存导致未定义的行为。

因此,对于最小更新,您的 create_string() 功能与

相同
str = (StringContainer*)malloc(sizeof(StringContainer));

str->mlength = max_length;
str->value = NULL; //add this