在C中操作字符串时,仅在realease配置中出现分段错误
下面是函数fast_integer_output,它将输入_integer从基数2转换为输出_base 下面是bigint和my_str结构以及create_string函数(在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*
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;
}