我有一个非常简单的缓冲区实现,可以在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 *cb
和ln_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;
}