未知段错误
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
在此先感谢您的帮助。我已经完成了我可以尝试调试的所有研究。添加 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