提前感谢您的帮助。我做了所有可以尝试调试的研究。添加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是否成功。
答案 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