zeichenketten-zugriff bei struct variable
-
warum funktioniert folger code nicht..
hab an der kommentierten zeile schon alles mögliche versucht..
vielen dank im voraus#include <stdio.h> struct student {char name[20]; int semester;}; int main(void){ struct student hans; praz.name= "Hans Meier"; //hier meckert der compiler praz.semester=5; return 1; }
-
Wenn die struct in den Speicher geladen wird, wird speicher für alle member reserviert, dadurch bekommen alle member eine bestimmte adresse zugewiesen.
Mit
hans.name = "Hans Meier";
versuchst du nun dem array eine neue anfangsadresse zuzuweisen, nämlich die der stringkonstante "Hans Meier" die sich irgendwo im Speicher befindet. Das führt zum Fehler, da das array schon eine festgelegte anfangsadresse hat, die es beim "laden" der struct bekommen hat.
Den gleichen fehler bekommst du auch hier;
char c[20]; c = "Test"; // klappt nicht
Lösung 1:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 20 struct student { char name[MAX]; int semester; }; int main(void) { struct student hans; strncpy(hans.name,"Hans Meier",19); // in hans.name wird der string "Hans Meier" kopiert hans.semester = 5; return EXIT_SUCCESS; }
Lösing 2:
#include <stdio.h> #include <stdlib.h> struct student { char *name; int semester; }; int main(void) { struct student hans; hans.name = "Hans Meier"; // jetzt klappt es da name ein char-pointer ist hans.semester = 5; return EXIT_SUCCESS; }
-
danke für die rasche u. ausführliche erklärung.
ich hab beim abtippen natürlich noch den zusätzlichen leichtsinnsfehler gemacht:
in main() einen anderen namen für die strukturvariable verwendet als zuvor vereinbart.aber das eigentliche problem wurde mit der antwort gelöst
-
Gewöhn dir aber das strcpy schnell ab, immer strncpy benutzen!
-
Gewöhn dir aber das strcpy schnell ab, immer strncpy benutzen!
-
stimmt, falls die länge der stringkonstanten länger ist als das array
thx
-
strcpy kannst du sehr wohl benutzen, wenn du weißt, was du tust. lass dir bloß nix einreden. du mußt eben nur entscheiden, wo es sinnvoller wäre ein strncpy anzuwenden.
-
Mal abgesehen davon, dass strcpy gar nicht erwähnt wurde, bevor gesagt wurde "gewöhn dir das bloß wieder ab"...
-
bernibutt schrieb:
strcpy kannst du sehr wohl benutzen, wenn du weißt, was du tust. lass dir bloß nix einreden. du mußt eben nur entscheiden, wo es sinnvoller wäre ein strncpy anzuwenden.
und hab schon erlebt, dass viele strncpy verwenden, weil sie denken, dass sie damit sicherer programmieren aber trotzdem die 0-Terminierung übersehen... Wer strcpy nicht richtig verwendet wird strncpy erst recht nicht richtig verwenden.
-
einigen wir uns drauf das der thread-steller einfach die pointer-methode benutzt
-
_matze schrieb:
Mal abgesehen davon, dass strcpy gar nicht erwähnt wurde, bevor gesagt wurde "gewöhn dir das bloß wieder ab"...
Mal abgesehen davon, dass der ursprüngliche Text abgeändert wurde.