如何消除C中的分段错误(核心转储)



我有一个非常简单的缓冲区实现,可以在C中写入和读取索引。下面是.c文件,然后是main((之后的文件。

我不明白为什么,但我得到了分割错误(核心转储(。

下面是.c文件。

#include <stdio.h>
#include <stdlib.h>
#include "contbuf.h"
typedef struct cont_buf
{
char *buf;
ln_bsize size;
int read_index;
int write_index;
int has_data;
} cont_buf;
cont_buf *create_cont_buf(ln_bsize *size)
{
cont_buf *cb;
cb->buf = malloc(sizeof(float)*(*size));
if(cb->buf == NULL){
printf("Failed to get or allocate memoryn");
exit(1);
}
cb->size = *size;
cb->read_index = 0;
cb->write_index = 0;
cb->has_data = 0;
if (!cb->buf)
return NULL;
return cb;
}
void free_cont_buf(cont_buf *cb)
{
free(&cb->buf);
}
void write_float_to_cb(cont_buf *cb, float *f)
{
if ((cb->write_index + 1) > cb->size)
{
cb->write_index = 0;
}
cb->buf[cb->write_index] = *f;
cb->write_index += 1;
if (cb->write_index > cb->has_data)
cb->has_data = cb->write_index;
}
void read_float_from_cb(cont_buf *cb)
{
float f;
f = cb->buf[cb->read_index];
printf("float number: %fn", f);
}

这里是main((文件,只是为了测试C.中的函数

还有一个.h文件,我并没有分享,但它只是函数和typedef的声明。

#include <stdio.h>
#include <stdlib.h>
#include "contbuf.h"
int main() {

struct cont_buf* cb;
ln_bsize* size;
*size = (ln_bsize)20;
float *f;
*f = 3.25F;

cb = create_cont_buf(size);

write_float_to_cb(cb, f);

read_float_from_cb(cb);

return 0;

}

有人能帮我弄清楚为什么吗?我也找不到解决问题的方法,因为运行甚至没有运行,所以我无法判断代码何时中断。

中存在主要问题

ln_bsize* size;
*size = (ln_bsize)20;

这里,size没有指向任何有效的内存位置,但您试图取消引用它,并将值放入它所指向的内存位置。这是无效的内存访问,会调用未定义的行为。

为了避免这种情况,您需要确保size指向有效的内存位置。对于这种情况,您可以通过不将size完全设置为指针类型来避免这个问题。只做

ln_bsize size = 20;

然后,将其传递给类似的函数

cb = create_cont_buf(&size);

在代码的许多其他地方,您会遇到使用/取消引用未初始化内存的问题。

cont_buf *cb;
cb->buf = malloc(sizeof(float)*(*size));

cb未初始化,但您取消引用它,行为未定义

ln_bsize* size;
*size = (ln_bsize)20;

关于大小的相同之处

我鼓励您考虑编译器产生的警告,并要求更多可能使用-Wall或更好的-Wall -Werror选项(如果使用gcc (

您忘记为cont_buf *cbln_bsize* size应该指向的位置分配内存。

CCD_ 8和CCD_。它们的目的是指向各自类型的对象。

初始化结构的任何成员(如cb->buf = malloc(sizeof(float)*(*size));(或初始化引用对象*size = (ln_bsize)20;的尝试调用未定义的行为。

为它们应该指向的位置分配内存:

cont_buf *cb = malloc(sizeof(cont_buf));
if (!cb)
{
fputs("Error at allocation!", stderr);
return EXIT_FAILURE;
}

ln_bsize* size = malloc(sizeof(ln_bsize));
if (!size)
{
fputs("Error at allocation!", stderr);
return EXIT_FAILURE;
}

相关内容

  • 没有找到相关文章

最新更新