未知的Segfault

时间:2015-06-08 05:36:14

标签: c segmentation-fault gdb

提前感谢您的帮助。我做了所有可以尝试调试的研究。添加printf似乎会改变发生段错误的地方。我对gdb并不熟悉,但不知怎的,程序在没有问题的情况下运行。我有一些量子观察问题正在发生。让我们进入代码。

这只是为了重新认识自己。段错误发生在create_string()的某个地方。我永远无法在 set_string(str,src); 调用之前显示printf()。

#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, '\0', 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] != '\0' )
        {
            offset_idx = offset_idx + division;
        }

        division /= 2;
    }

    return offset_idx;
}

谢谢大家的时间。我确信这很简单,可能是根本性的,但我的Google-foo还不够发达,无法找到问题的根源。

此外,这种设计模式是否常见?显然,malloc应该是免费的。我还要补充一下,检查malloc是否成功。

1 个答案:

答案 0 :(得分:2)

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
相关问题