为什么一个简单的赋值会在C代码中产生分段错误



我的代码中可能有一个错误,但仅仅通过注释一个甚至没有执行的整数,就可以区分分段错误和程序的成功运行。为什么会发生这种情况?

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)?我是不是错过了什么——有人能帮忙吗--->好的,我发现了这个为什么允许在结构中使用未定义大小的数组--->个人注意:好吧,我建议使用固定的数组长度,或者,如果没有明确的长度上限,则使用指针。

相关内容

  • 没有找到相关文章

最新更新