在C中操作字符串时,仅在realease配置中出现分段错误

在C中操作字符串时,仅在realease配置中出现分段错误,c,arrays,string,segmentation-fault,C,Arrays,String,Segmentation Fault,下面是函数fast_integer_output,它将输入_integer从基数2转换为输出_base 下面是bigint和my_str结构以及create_string函数(bitarray只是指向long的指针) 这些函数负责内存管理。现在他们只是将函数包装为free和malloc,但是如果它运行缓慢,我想实现某种内存池 void init_memory(void* memory, size_t size) { unsigned char* tmp = (unsigned char*

下面是函数fast_integer_output,它将输入_integer从基数2转换为输出_base

下面是bigint和my_str结构以及create_string函数(
bitarray
只是指向
long
的指针)

这些函数负责内存管理。现在他们只是将函数包装为free和malloc,但是如果它运行缓慢,我想实现某种内存池

void init_memory(void* memory, size_t size)
{
    unsigned char* tmp = (unsigned char*) memory;
    unsigned char c = 0;

    while (size > 0)
    {
        *tmp = c;
        tmp++;
        size--;
    }
}

void* get_memory(size_t size)
{
    void* memory = malloc(size);
    init_memory(memory, size);
    return memory;
}

void release_memory(void** memory)
{
    free(*memory);
    *memory = 0;
}
问题是调试配置时一切正常,但在发布配置时,函数fast\u integer\u输出在线路上失败:

result = concatenate(low,  k - low->length, high);
问题是

my_str* low = fast_integer_output(remainder, output_base);
它从这段代码返回

if(less_than(input_integer, base))
{
    char* p_char = (char*) get_memory(sizeof(char));
    p_char[0] = int_to_char(*(input_integer->number));

    result = create_string(p_char, 1);
}
返回垃圾,因此在分段错误时失败

我对这段代码也有同样的问题:

QString buffer; // function parameter in real code
instance_data_t data = {(unsigned char*) buffer.toStdString().c_str(), 0, 0, 0, 0, 0, 0, {0, 0}, {0, 0}, cur_state};
但我成功地将它改为以下内容:

unsigned char c_buffer[1024];
memset(c_buffer, '\0', sizeof(c_buffer));
strcpy((char *) c_buffer, buffer.toStdString().c_str());

instance_data_t data = {c_buffer, 0, 0, 0, 0, 0, 0, {0, 0}, {0, 0}, cur_state};
重要的一点是,除了write、read、malloc和free之外,我不能使用任何其他函数(所以没有strcpy,上面的代码是来自测试的,我不会提供)

这不是一个家庭作业,这是一个工作任务(我想得到)


我已经搜索并阅读了大约15-20个问题,因此我不会列出所有问题,但问题是,如果问题不是很具体,那么分段错误主要不是因为字符串操纵,如果是,那么主要是因为索引超出范围。

您分配的字符串不是以null('\0')结尾的

我会这样做:

  char* p_char = (char*) get_memory(sizeof(char) * 2);

  p_char[0] = int_to_char(*(input_integer->number));
  p_char[1] = 0;

  result = create_string(p_char, 1);
正如EOF指出的(见评论), create_string函数作为no return语句。 因此,垃圾确实被退回

my_str* create_string(char* c_str, long length)
{
    my_str* str = (my_str*) get_memory(sizeof(my_str));
    str->c_str = c_str;
    str->length = length;
    return str;
}

你为什么不在valgrind内运行你的程序?。现在除了代码整体看起来很可疑之外,没有什么可说的了。它是C++伪装的,不是C,对吗?C“字符串”应该是代码> 0 > /代码>终止。@ EOF,我不这么认为,你能解释为什么吗?@ EOF SIZEOF(MyOSTR)将返回MyOSTR结构的大小,而不是指针的大小。然后,该功能将分配适当数量的memory@alk是,因为sizeof(char)=1。然而,这很容易出错。将长度乘以sizeof(type)来分配数组是一种很好的做法。
  char* p_char = (char*) get_memory(sizeof(char) * 2);

  p_char[0] = int_to_char(*(input_integer->number));
  p_char[1] = 0;

  result = create_string(p_char, 1);
my_str* create_string(char* c_str, long length)
{
    my_str* str = (my_str*) get_memory(sizeof(my_str));
    str->c_str = c_str;
    str->length = length;
    return str;
}