Programmieren in c Listen?

1 Antwort

Du hast die Microsoft-Version von strcpy() benutzt ( strcpy_s() ) aber im Code wie die normale Version (also die vom C Standard) aufgerufen.

Wenn man es mit der normalen Version macht, funktioniert es wie es soll: https://www.ideone.com/d4g1p7

Wenn du unbedingt das von Microsoft nehmen willst, musst du dort in der Dokumentation gucken, wie man die Funktion benutzen muss.

errno_t strcpy_s(
char *dest,
rsize_t dest_size,
const char *src
);

Wie du sehen kannst, muss man da noch angeben, wie viele Zeichen man kopieren will (bzw. auf wie viel Speicher der dest-Pointer zeigt). Du könntest also probieren, ob es funktioniert, wenn du den Aufruf so änderst (nicht getestet):

strcpy_s(bond->actor, 25, "Sean Connery");

Du gibst also einfach noch an, wie viel Speicher im dest-Pointer vorhanden ist. 13 wäre die kleinste Zahl, die du da angeben solltest, weil der String, den du kopieren willst, 12 Zeichen (+ '0' = 13 Zeichen) lang ist (:

Wenn du Code schreiben willst, der auch auf anderen Systemen als Windows compilliert, solltest du aber die normalen Funktionen nehmen und nicht die vom MS geänderten Versionen.

(Edit: kleine Fehler korrigiert)

Ahh wirklich vielen dank. Ich hab mein Code noch etwas erweitert, sodass man einen Namen vom Benutzer erfragen kann der dann in der Liste gespeichert werden kann.

jedoch funktioniert der Code nicht, wäre es im Bereich des möglichen mir auch hier weiterzuhelfen wäre dir absolut dankbar.

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




typedef struct jb
{
	char actor[25];
};


typedef struct element {
	jb block;
	element* next;
};


int main()
{
	char actor[25];
	element*start = NULL;


	printf("Geben Sie Ihren Vornamen ein:\n");
	fgets(actor, 25, stdin);
	strcpy_s((start->block).actor, 25,actor);
	


	printf("Die erste Struktur wurde erzeugt:\n");
	printf("\tbond->actor=%s\n", (start->block).actor);
	printf("\tAdresse der folgenden Struktur=%p\n", start->next);
	return 0;
}

Die Fehler sind:

Warnung C6011 Dereferenzierender NULL-Zeiger "start". Project2 24

Fehler (aktiv) E0020 Der Bezeichner ""start"" ist nicht definiert. 19

Fehler (aktiv) E0020 Der Bezeichner ""element"" ist nicht definiert. c 19

Fehler (aktiv) E0020 Der Bezeichner ""element"" ist nicht definiert. 13

Fehler (aktiv) E0020 Der Bezeichner ""jb"" ist nicht definiert. 12

0
@Thena03

In der Fehlermeldung steht doch schon, was falsch ist (:

Du versuchst auf einen Nullpointer (also einen Pointer, der noch NULL ist) zuzugreifen, was natürlich nicht möglich ist :D

Wenn du einfach noch Speicher für den start-Pointer reservierst ( *alloc() ), sollte die Warnung weggehen.

Bei dem typedef struct element ... musst du intern noch struct dazuschreiben, weil der typename an der Stelle noch nicht definiert wurde (wird er erst wenn das Semicolon erreicht wurde). Müsste also noch so geändert werden:

typedef struct element {
	jb block;
	struct element* next;
};
1
@MaxMustermanOk

Danke für deine Antwort.

Diesen Punkt habe ich noch nicht so richtig verstanden

Wenn du einfach noch Speicher für den start-Pointer reservierst ( *alloc() ), sollte die Warnung weggehen.

Was müsste ich genau hinzufügen.

0
@Thena03

Naja irgendeine alloc-Funktion :D

Also z.B. so wie oben mit malloc oder calloc (oder realloc falls du das auch kennst :D)

element * start = (element*)malloc(sizeof(element));
element * start = (element*)calloc(1, sizeof(element));
1
@MaxMustermanOk

Ahh ok, habe ich geändert, aber diese Zeile ist grün gekringelt und als Fehler steht:

Warnung C6011 Dereferenzierender NULL-Zeiger "start". 29

Was kann man dagegen tun?

	strcpy_s((start->block).actor, 25, actor);
0

Was möchtest Du wissen?