Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Sonstige Fragen » Kellerspeicher C » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Kellerspeicher C
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Grule9
unregistriert
Kellerspeicher C Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Meine Frage:
Ich möchte einen Kellerspeicher in C bauen. Die Zahlen (integer reichen) sollen im Heap gespeichert werden, deshalb möchte ich Zeiger benutzen. Bei push(x) soll die Zahl x im Heap gespeichert werden und bei pop() die letzte gespeicherte Zahl aus push() ausgegegeben werden.

Meine Ideen:
Idee bei der Funktion push(x):

int push(x){
*zeiger = malloc(sizeof(int);
*zeiger = x;
}

Wie kann ich dieses x nun in einer anderen Funktion pop() aufrufen? ich habe *zeiger ja nur in push.

Bisheriger Quelltext:

#include <stdio.h>
#include <stdlib.h>


int push(x){
int *zeiger = malloc(sizeof(int));
*zeiger = x;
}


int pop(void){
printf("%d\n", ???);
}


int main(void) {
push(5);
push(20);
pop();

return EXIT_SUCCESS;
}
08.12.2015 15:34
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Sollte laufen. Es fehlen noch Prüfungen, ob malloc Speicher reservieren kann und ob bei pop noch etwas auf dem Stack steht.
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
#include <stdio.h>
#include <stdlib.h>

struct entry {
	int value;
	struct entry* prev;
};

struct entry* push(struct entry* top, int value) {
	struct entry* newEntry = (struct entry*)malloc(sizeof(struct entry));
	newEntry->value = value;
	newEntry->prev = top;
	top = newEntry;
	return newEntry;
}

int pop(struct entry** top) {
	int value = (*top)->value;
	*top = (*top)->prev;
	return value;
}

int main() {
	struct entry* stack = (struct entry*)malloc(sizeof(struct entry));
	stack = push(stack, 1);
	stack = push(stack, 2);
	stack = push(stack, 3);
	printf("%d\n", pop(&stack));
	printf("%d\n", pop(&stack));
	printf("%d\n", pop(&stack));
}


__________________
Syntax Highlighting fürs Board (Link)
08.12.2015 17:28 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Grul9
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Dankeschön smile
08.12.2015 18:25
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo Grul9,

mein Ansatz ist ein wenig schwieriger zu verstehen, sollte aber für's Lernen gut sein. Es ist noch eher am echten Stack angelehnt, da hier auch mit einem Adressbereich gearbeitet wird und nicht mit einer verketteten Liste. Auch hier alles ohne Prüfung.

main.c:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
#include <stdlib.h>
#include <stdio.h>

#include "stack.h"

int main(int argc, char **argv){
	int i;

	init(100);

	for (i=0; i<100; i++){
		push(i);
	}

	for (i=0; i<100; i++){
		printf("%d, ", pop());
	}
	printf("\n");
	
	destroy();

	return 0;
}


stack.h
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
#ifndef _STACK_H_
#define _STACK_H_

void init(int);
void destroy();
void push(int);
int pop();

#endif //_STACK_H_


stack.c:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
#include <stdio.h>
#include <stdlib.h>

#include "stack.h"

static int *basePointer = NULL;
static int *stackPointer = NULL;

void init(int elements){
	stackPointer = basePointer = (int *)realloc(basePointer, elements * sizeof(int));
}

void destroy(){
	free(basePointer);
	stackPointer = basePointer = NULL;
}


void push(int value){
	*(stackPointer++) = value;
}

int pop(){
	return *(--stackPointer);
}


Falls es dazu Fragen gibt, gerne hier stellen.

Gruß,

Karlito
09.12.2015 14:19 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Sonstige Fragen » Kellerspeicher C