gpt4 book ai didi

c - 段错误以及如何使用 union 类型

转载 作者:行者123 更新时间:2023-11-30 20:50:50 25 4
gpt4 key购买 nike

我正在用 C 构建顶点库,由于某种原因我遇到了段错误。我将首先展示代码并提出问题:

顶点.h:

#ifndef _VERTEX_AM_H_LB
#define _VERTEX_AM_H_LB 1
#pragma once
#include<stdint.h>
/**
* Vertex Library C
*
* GCC C99 <Vertex.h>
*
* @author Amanuel Bogale
* @copyright 2016 Amanuel Bogale
* @license http://www.opensource.org/licenses/mit-license.html MIT License
*
*/

//@union for storing
//data types supported
//for vertex
typedef union
{
char ch; //1 byte
unsigned char uch;//1 byte
signed char sch;// 1 byte
int in;//2 or 4bytes
unsigned int uin;//2 or 4bytes
long ln;// 4byte
unsigned long uln; //4byte
long long lnln; //8byte
short sh;// 2byte
unsigned short ush; //2bytes
float fl;//4byte
double db; //8byte
long double ldb; //10byte
}type;

/*
* @struct for defining
* vertex. Initalize First
*/
struct vertex_am
{
size_t current_size;
type type;
long long size_contents;
void **contents; //Array Of Void Pointers
//Add to the end of array
void (*add)(struct vertex_am *self,void*val);
};

typedef struct vertex_am vertex_am;



vertex_am* init_vertex(size_t size, vertex_am* vertex);
void end_vertex(vertex_am* vertex);
long long get_elements_num(vertex_am vert);
void add_end(vertex_am vert, void* val);
void* get_val(vertex_am vert,long long index);
#endif

顶点.c:

#include<stdlib.h>
#include<stdio.h>
#include "../includes/Vertex.h"

/**
* Vertex Library C
*
* GCC C99 <Vertex.c>
*
* @author Amanuel Bogale
* @copyright 2016 Amanuel Bogale
* @license http://www.opensource.org/licenses/mit-license.html MIT License
*
*/

vertex_am* init_vertex(size_t size, vertex_am* vertex)
{
vertex = malloc(size);
vertex->current_size = size;
vertex->size_contents = 0;
return vertex;
}

long long get_elements_num(vertex_am vert)
{
return(vert.size_contents);
}

void add_end(vertex_am vert, void* val)
{
vert.contents[vert.size_contents] = val;
vert.size_contents++;
}

void* get_val(vertex_am vert,long long index)
{
return (vert.contents[index]);
}


void end_vertex(vertex_am* vertex)
{
free(vertex);
}

main.c:

#include<stdlib.h>
#include<stdio.h>
#include<stdint.h>
#include "includes/Vertex.h"

int main()
{
printf("In");
vertex_am *vert = NULL;
vert = init_vertex(sizeof(*vert), vert);
add_end(*vert,(void *)34);
// printf ("%d", *((int*)get_val(*vert, 0) ));
end_vertex(vert);
return 0;
}

生成文件:

C = gcc 
TARGETS = main
SUB_TARGETS = sources/Vertex.c
CFLAGS = -Wall -g -std=c99 -pthread -Werror -o exec -g -Q -O0


all: clean $(TARGETS)

$(TARGETS):
$(C) $(CFLAGS) $@.c $(SUB_TARGETS) -o $@

clean:
rm -f $(TARGETS)

好的,我有几个问题。

  1. 我遇到了上面的段错误。而且我找不到它在哪里。请帮忙
  2. 适用于 gcc 和 Linux 环境的任何段错误调试器
  3. 我将如何使用 union 来操作类型。我的意思是像这样的 vector_am vec 。我将如何使用 union 来获得用户想要的类型。或者 void* 已经是一个更好的主意了吗?

如果有帮助,我们将不胜感激。感谢您的阅读。

最佳答案

I have a segmentation Fault above. And i cant locate where it is

使用gdb执行代码

gdb ./exec

然后输入“run”,gdb 将发挥他的魔力并告诉您段错误的确切位置,您将能够理解原因。

从阅读您的代码来看,您似乎正在访问 vert.contents 指针,但没有为其分配内存......

vert.contents[vert.size_contents]

vert.contents是一个尚未分配/初始化的双指针

Any Segmentation Fault Debugger for gcc and linux enviorment

gdb 是迄今为止我所知道的最好的..

关于c - 段错误以及如何使用 union 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38191021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com