2016-07-04 5 views
-4

Im Im Konstruieren einer Vertex-Bibliothek in C zu verwenden, und aus irgendeinem Grund bekomme ich eine Segmentation Fault. Im gehend, zuerst den Code zu zeigen und fragen Frage:Segmentation Fault, und wie Unions für Typen

Vertex.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 

Vertex.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; 
} 

Makefile:

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) [email protected] $(SUB_TARGETS) -o [email protected] 

clean: 
    rm -f $(TARGETS) 

Ok ich habe paar Fragen.

  1. Ich habe eine Segmentierung oben Fehler. Und ich kann nicht finden, wo es ist. Hilfe Bitte
  2. Alle Segmentation Fault Debugger für gcc und Linux Umgebung
  3. Wie würde ich gehen über die Verwendung von Gewerkschaften zu manuplizieren Typen. Damit meine ich wie diese vector_am vec. Wie würde ich gehen, also bekomme ich, was der Benutzer will, als ein Typ mit Union. Oder ist die Leere * schon eine bessere Idee?

Hilfe wäre willkommen. Danke fürs Lesen.

+2

Ich habe keine Ahnung, was der Code tun soll und ich habe keine Ahnung, was Sie in (3) fragen. –

+0

I litterarly sagte, es ist eine Vertex-Bibliothek. Das bedeutet, ich mache meine eigene "Klasse" für Dynamic Array. – amanuel2

+1

Niemand weiß, was "Vertex-Bibliothek" für * Sie * bedeutet. Sie sollten das Verhalten beschreiben, anstatt von uns zu verlangen, Ihren Code zurückzuentwickeln. –

Antwort

1

Sie können die Segmentierung Fehlerstelle finden, indem Sie die folgenden Schritte aus:

  • Compile mit gcc -g
  • Führen Sie Ihr Programm Debug-Informationen hinzuzufügen, mit gdb ./yourprogram
  • In der GDB Aufforderung drücken r die laufen Programm
  • Wenn es abstürzt, schreibe bt, um das Backtrace zu erhalten.

Für den Absturz selbst, es sieht aus wie Sie Speicher reservieren nicht vertex_am'scontents Mitglied so den Zugriff auf sie zu einem Absturz führen.

+0

Vielen Dank, du bist ein Lebensretter, aber ich habe zwei Fragen für dich, wenn es dir nichts ausmacht .. Lass uns mit dem ersten anfangen, das heißt, es heißt, der Fehler ist: vert.contents [vert.size_contents] = val. Auf meiner Funktion hinzufügen. Wie wäre das? – amanuel2

+0

@Dsafds, ich habe einige Informationen in meine Antwort über den Absturz hinzugefügt. – SurvivalMachine

+0

Ok das hat funktioniert ... Und ich verstehe warum. aber jetzt, wenn ich den Wert void * drücke, gibt es mir einen seg-Fehler dafür. 'printf ("% d ", * ((int *) get_val (* vert, 0)));' – amanuel2

2

Ich habe eine Segmentierung oben Fehler. Und ich kann nicht finden, wo es

ist

den Code mit gdb ausführen

gdb ./exec 

geben Sie dann ‚Ausführen‘ und GDB wird seine Magie tun und sagen Ihnen genau, wo das Segmentierungsfehler ist, und Sie werden in der Lage sein, um zu verstehen warum.

aus dem Code liest es sieht aus wie Sie vert.contents zugreifen, ohne sie für Speicher zuweisen-Zeiger ...

vert.contents[vert.size_contents] 

vert.Inhalt ist ein Doppelzeiger, der

hat zugewiesen/initialisiert Jede Segmentation Fault Debugger für gcc und Linux enviorment nicht

GDB ist bei weitem das beste, das ich je gekannt ..

+0

Frage .. es gibt mir Seg-Fehler dafür .. 'printf ("% d ", * ((int *) get_val (* vert, 0))); '... Ich versuche, auf den Wert für den void-Zeiger zuzugreifen – amanuel2

+0

Andere Frage: Ich habe dies am Ende der Funktion add_end hinzugefügt, ist das, was Sie tun sollen? 'vert-> contents = malloc (sizeof (vert-> contents) * 2)' – amanuel2

+0

Ich weiß nicht, warum Sie einen Doppelzeiger (zweidimensionales Array) verwenden, aber dann müssen Sie malloc in beiden Dimensionen, würde ich versuch: 'vert-> contents = (void **) malloc (sizeof (void) * number_of_array_elements_you_need);' Dann, wenn Sie ein Element hinzufügen möchten, sagen wir, die erste Dimension index 0 müssen Sie tun: 'vert-> Inhalt [0] = (void *) malloc (sizeof (void) * number_of_array_elements);' dann lesen und schreiben Nutzung: 'vert-> Inhalt [0] [0]' Zwei Denken Sie daran: - Überprüfen Sie immer malloc zurückgegebenen Wert (bei Fehler wird es Null sein) - Brauchen Sie wirklich ein zweidimensionales Array? –