如何消除C语言中的分段错误(内核转储)?
我有一个非常简单的缓冲区实现,用C语言编写和读取索引。 下面是.c文件,然后是main() 不明白为什么,但我得到了分割错误(核心转储) 下面是.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
#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
只是指针。它们的目的是指向各自类型的对象
尝试初始化结构的任何成员,如atcb->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;
}