如何消除C语言中的分段错误(内核转储)?

如何消除C语言中的分段错误(内核转储)?,c,malloc,C,Malloc,我有一个非常简单的缓冲区实现,用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; in

我有一个非常简单的缓冲区实现,用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 memory\n");
        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: %f\n", f);
}
#包括
#包括
#包括“contbuf.h”
类型定义结构cont_buf
{
char*buf;
尺寸;
int-read_索引;
int-write_索引;
int有_数据;
}续;
cont_buf*创建cont_buf(ln_bsize*大小)
{
续*cb;
cb->buf=malloc(sizeof(float)*(*size));
如果(cb->buf==NULL){
printf(“获取或分配内存失败\n”);
出口(1);
}
cb->size=*大小;
cb->read_index=0;
cb->write_index=0;
cb->has_data=0;
如果(!cb->buf)
返回NULL;
返回cb;
}
无无效(续)
{
免费(&cb->buf);
}
无效写入浮点数到浮点数cb(续浮点数*cb,浮点数*f)
{
如果((cb->write_index+1)>cb->size)
{
cb->write_index=0;
}
cb->buf[cb->写入索引]=*f;
cb->write_index+=1;
如果(cb->write_index>cb->has_data)
cb->has_data=cb->write_索引;
}
从cb读取浮点数无效(续)
{
浮动f;
f=cb->buf[cb->read_index];
printf(“浮点数:%f\n”,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;
    
    }
#包括
#包括
#包括“contbuf.h”
int main(){
结构cont_buf*cb;
ln_bsize*大小;
*大小=(ln_bsize)20;
浮动*f;
*f=3.25F;
cb=创建控制单元(大小);
将浮点数写入cb(cb,f);
从_cb(cb)读取_float_;
返回0;
}

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

您的系统中存在一个主要问题

    ln_bsize* size;
    *size = (ln_bsize)20;
在这里,
size
没有指向任何有效的内存位置,但您尝试取消引用它并将值放入它所指向的内存位置。这是调用的无效内存访问

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

 ln_bsize size = 20;
然后,将其传递给函数,如

  cb = create_cont_buf(&size);
您在代码的许多其他位置都存在使用/取消引用未初始化内存的问题

cb未初始化,但如果取消引用,则行为未定义

大小也一样


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

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

cb
size
只是指针。它们的目的是指向各自类型的对象

尝试初始化结构的任何成员,如at
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;
}

n_bsize*大小*大小=(ln_bsize)20如果我想动态malloc“char*buf”(根据函数参数大小)该怎么办?但是没有完整的结构?
   ln_bsize* 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;
}