Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Probleme mit alloc

Empfohlene Antworten

Veröffentlicht

Hallo,

ersteinmal schöne Restweihnachten. wir haben folgende Aufgabe gekriegt:

Schreiben Sie eine Funktion, die ein Feld mit double-Werten initialisieren soll. Dazu sollen

die Größe des gewünschten Feldes und ein Pointer übergeben werden.

Prototyp: void allocMem(int length, void **ptrptr);

Die Funktion soll per malloc Speicher anfordern, und den Pointer auf den Speicherbereich

auf die uebergebene Variable korrekt speichern. Anschließend soll das Feld per memset (informieren

Sie sich per man–Page über den Befehl) mit Nullen initialisiert werden.

Schreiben Sie ein Hauptprogramm, welches die Funktion aufruft (mit einer vom Benutzer eingegebenen

Länge) und das Feld mit Benutzereingaben füllt. Am Ende des Hauptprogramms

soll natürlich der Speicher wieder freigegeben werden.

Bisher sieht unser Programm so aus:


#include <stdio.h>

#include <stdlib.h>

#include <string.h>


void allocMem (int length, void **ptrptr, int f)

{

    double *feld[length];

    feld=(double *) malloc(length);

    memset(*feld, 0 ,length);

    feld[f]=**ptrptr;

}    


void eingabe (int i, int *wert)

{ 

int a;

    printf("%d. Zahl eingeben", i);         

    scanf("%d", &a);

    *wert=a;

}


int main()

{

int i=1,groesse,*zahl;

    printf("Geben Sie die gewuenschte Groeße ein");

    scanf("%d", &groesse);

    while(i<groesse)

    {

    allocMem(groesse , eingabe(i, &*zahl),i);

    i++;

    }

return(0);

}

Zum einen spuckt er einige Fehler beim kompilieren aus. In der main funktioniert die Übergabe an die allocMem nicht so, wie sie sollte. Er klagt über Probleme, dass er double * übergibt usw...Außerdem steht ja in der Aufgabe dieser Prototyp und da wird ja der Zähler nicht übergeben. meint ihr es ist schlimm, wenn man deren Prototyp ändert?

Vielen Dank schonmal

Ich glaube, du hast nicht verstanden, wie allocMem funktionieren soll. Die Funktion soll Speicher reservieren, initialisieren und den Zeiger auf den reservierten Speicher über den Parameter ptrptr rausgeben. Ein Array von Zeigern brauchst du dafür nicht, denn der einzige Zeiger, der in der Funktion benötigt wird, kommt als Parameter rein.

Auch brauchst du weder eine Eingabe-Funktion noch eine Schleife, die sie aufruft. Davon steht nichts in der Aufgabe.

In einem älteren Thread hatte ich dir schon einmal geraten, deine Variablen zu initialisieren. Hier reichst du mit zahl wieder einen uninitialisierten Zeiger durch die Gegend.

Vielleicht wäre es hilfreich, wenn wir hier Schritt für Schritt vorgehen und die Aufgabe auf einfache Tasks reduzieren, die Du dann auch wirklich lösen kannst;)

Prototyp: void allocMem(int length, void **ptrptr);

Die Funktion soll per malloc Speicher anfordern, und den Pointer auf den Speicherbereich

auf die uebergebene Variable korrekt speichern

Das heißt, wir haben einen Funktionsprototypen vorgegeben bekommen, der so wie es oben steht lautet (und nicht anders).

Desweiteren haben wir die Anforderung, Speicher anzufordern. Das sollte als Ausgangspunkt erst einmal genügen.

Frage: Wie alloziert man unter C einen zusammenhängenden Speicherblock variabler Größe?

Hey,

vielleicht solltest du dein Programm erst auf die minimale Aufgabenstellung beschränken. Hier ist die Mainmethode so wie ich verstanden habe, dass du deine Aufgabe lösen sollst. Damit sollte der Aufruf der Funktion

allocMem(int length, void **ptrptr); funktionieren. (Nicht getestet)

In der Methode musst du dan nur noch deinen malloc ausführen.

int main(){

int groesse=0;

double *feld;

printf("Geben Sie die gewuenschte Groeße ein");

scanf("%d", &groesse);

allocMem(groesse, &feld);

for(int i=0;i<groesse;i++){

feld=NULL;

}

delete feld;

}

  • 2 Wochen später...
Hi,

nur mal so nebenbei: Sind das Aufgaben für ein Studium oder eine Ausbildung o.ä.?

Universität schätze ich, iwas mit Grundlagen bestimmt^^

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.