1.5k Aufrufe
Gefragt in Anwendungen(Java,C++...) von simontheprogger Mitglied (719 Punkte)
Hallo,
ich habe ein kleines Problem in meinem c-Programm:

ich habe eine struct mit einem pointer drin:


struct vektor
{
float *feld;
int laenge;
};


Jetzt soll der Vekor erzeugt werden. Da das in einer Funktion geschieht, erzeuge ich einen Pointer und alloziiere den Speicher, um später nur den Pointer zurückgeben zu müssen... (korrekt?)

struct vektor *neuvektor;

neuvektor = (struct vektor*) malloc(sizeof(struct vektor));

neuvektor->laenge = laenge;
neuvektor->feld = (char*) malloc(sizeof(char)*laenge);


das scheint zu funktionieren, mit

neuvektor->feld = "abcd";

kann ich auch meinen Vektor beschreiben...
nur kann ich die Felder nicht einzeln beschreiben:

neuvektor->*feld = 'e'; // das zum beispiel geht nicht
neuvektor->feld[0] = 'e'; // funktioniert auch nicht...


Ich nehme an ich hab irgendwo einen Denkfehler drin, es wäre toll von euch, wenn ihr mir ein bisschen helfen könntet.

3 Antworten

0 Punkte
Beantwortet von ennok Experte (1.2k Punkte)
*(neuvektor->feld) = (float*)0;

wenn meine C-Kenntnisse nicht all zu lang her sein sollten, dürfte die richtige Syntax sein.
0 Punkte
Beantwortet von Experte (3.2k Punkte)
erstmal:
neuvektor->feld = "abcd";

schreibt nicht abcd in den mit malloc alloziierten speicher sondern ändert einfach den Pointer. Das mag vielleicht im ersten Augenblick funktionieren, aber spätestens wenn du ne Funktion schreibst, die den Speicher per free() freigibst oder du anderweitig schreibend auf den Speicherbereich zugreifst, wirst du Laufzeitfehler kassieren.
Besser ist da
#include <string.h>
........
strcpy(neuvektor->feld, "abcd"); //normale strcpy-funktion, oder
strcpy_s(neuvektor->feld,neuvektor->laenge,"abcd"); //Funktion, die Pufferüberläufe vermeiden soll, nicht in allen compilern vorhanden


Als nächstes würde ich mal fragen, warum du das Datenfeld als float-Zeiger anlegst. Mir ist dafür ausschließlich char*, unsigned char* und vielleicht void* (aber eher selten) bekannt.
Ich sehe nichts in deinem Quellcode, was auf eine Verwendung als float hindeutet. Sogar die malloc-anfrage läuft über sizeof(char)*länge. Wenn du wirklich float haben willst, würde ich hier auch sizeof(float)*länge benutzen.

Damit dürfte sich auch der eigentliche Teil deiner Frage erklären lassen. Da du keine Fehlermeldungen gepostet hast, geh ich mal davon aus, dass es sich um einen Type-Missmatch-Fehler handelt.
Davon mal abgesehen, dass in der ersten Zeile der Stern so wie bei EnnoK gesetzt gehört, schreibst du chars in dereferenzierte float*, also float. da meckert er halt.

*(neuvektor->feld) = (float)'e';
(neuvektor->feld[0]) = (float)'e';

dadurch wirst du aber einen merkwürdigen Abstand zwischen den einzelnen chars erreichen, da die Adressen über sizeof(float) berechnet werden und halt einfach nur ein char reingequetscht wird.
Besser ist da:

*((char*)(neuvektor->feld+offset)) = 'e';
((char*)neuvektor->feld)[offset] = 'e';

Dadurch werden auch die Adressen auf char basiert berechnet (also ein Byte) und alle char-werte, die du reinschreibst, liegen schön hintereinander.

@EnnoK:
Dein Vorschlag geht zwar in die richtige Richtung, aber du versuchst, einem float einen float* zuzuweisen. In diesem Fall müsste man den float*-cast einfach weglassen, dann gehts auch ;)

Ele

P.S. Auch ich habe meine Beispiele nicht getestet und aus dem Kopf geschrieben. Sollten sie Fehler enthalten, bitte sagen. Ich will schließlich keine Unwahrheiten verbreiten =)
0 Punkte
Beantwortet von simontheprogger Mitglied (719 Punkte)
hi,

danke für eure Antworten. Das hat mir wirklich sehr geholfen - jetzt funktioniert mein Programm auch.

Gruß,
Simon
...