c - 未知段错误

标签 c segmentation-fault gdb

在此先感谢您的帮助。我已经完成了我可以尝试调试的所有研究。添加 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, '\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 应该与 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

关于c - 未知段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30701877/

相关文章:

c - 当我为 put() 函数输入断点时,为什么 GDB 不允许我输入输入?

c++ - 我们能否创建一个类似 scanf 的函数,在填充所有参数时返回 true,否则返回 false,而无需遍历所有变量?

mysql - c 将变量插入 mysql 数据库 beaglebone

c - "Program has stopped working"

c++ - pthread_create 段错误

objective-c - Xcode4 中的打印对象未按预期运行

复合字面量生命周期和 if block

c - 为什么 argc 与 strlen(argv[i]) 不同?

具有递归的 Python C API - 段错误

java - 有什么方法可以中断、终止或以其他方式解除(释放同步锁)单个死锁的 Java 线程,从而允许其他线程继续执行?