我的代码中可能有一个错误,但仅仅通过注释一个甚至没有执行的整数,就可以区分分段错误和程序的成功运行。为什么会发生这种情况?
C代码:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
//keep it > 0
#define DEFAULT_SIZE 50
struct List* init_list();
struct InternalString{
struct List* l;
};
struct List{
struct List * prev;
int max_pos;
int curr_pos;
char value[];
};
typedef struct{
int len;
struct InternalString* __internal__;
} String;
// string constructor
String build(){
String str;
// creates List with an array of max length = DEFAULT_SIZE
struct List* l = init_list(DEFAULT_SIZE);
struct InternalString inter;
inter.l = l;
str.__internal__ = &inter;
str.len = 0;
return str;
}
struct List* init_list(int length){
struct List* l = malloc((length * sizeof(char))+sizeof(struct List));
l->curr_pos = -1;
l->max_pos = length-1;
l->prev = NULL;
return l;
}
void push(char* str, String src){
struct List* l = src.__internal__->l;
int space = l->max_pos - l->curr_pos;
int i = 0;
for (; i < l->max_pos; i++){
if (str[i] == ' '){
printf("RETURNEDn"); // <---------- Run with the problematic line commented to see that it returns here.
return;
}
l->value[++(l->curr_pos)] = str[i];
}
int needed_space;
//int i_clone = i; // <---------- uncommenting this line provoques the segmentation fault
}
// tests
int main(){
String st = build();
push("defg", st);
}
我正在ubuntu 上使用gcc 9.4.0进行编译
这意味着存在内存访问冲突。有时程序仍然可以工作,或者在其他情况下不能工作。即使是一个简单的更改,比如添加一行,也可以区分工作和分段故障。不管怎样,不管有没有这行,你的代码都会导致这样的内存访问违规
你可以
- 编写更简单的代码
- 通过简单的方法搜索错误,比如注释各个部分和printf
- 使用调试工具其他选项:
- 只是为了检查:一个接一个地增加一些分配的内存大小,并检查是否存在差异(可能并不总是有助于发现问题(
- 分配更多的内存,例如+2个大小,一个在使用的数组结束之前,一个位于使用的数组末尾之后。另外,将特殊(不寻常(值写入周围的数组元素。每当这样一个周围的数组元素被覆盖时,这就表明了错误
在您的情况下,您的代码根本不会邀请您查看它。为什么?它似乎在很大程度上混淆了。请整理您的编码文档。真正地(例如,一个带有结构的部分,一个具有子程序的部分,而不是全部混合在一起(
在build()
中,变量inter
在离开build()
后丢失!
我使用
gcc -fsanitize=address,undefined main.c
非常有用的评论提供了点赞。
当将inter
定义为static
时,指示的内存泄漏消失
static struct InternalString inter;
(这可能不是您想要的,但这表明有一个内存泄漏(。
我有个问题要问你,这是什么?
struct List* l = malloc((length * sizeof(char))+sizeof(struct List));
如果您有一个结构,那么您只需通过any_number * sizeof(structure)
来分配关联的结构。你为什么要在里面加入sizeof(char)
?我是不是错过了什么——有人能帮忙吗--->好的,我发现了这个为什么允许在结构中使用未定义大小的数组--->个人注意:好吧,我建议使用固定的数组长度,或者,如果没有明确的长度上限,则使用指针。