Hallo beisammen,
bei einer kleinen Programmieraufgabe stieß ich unvermittelt auf drei mir unbekannte Problemfälle, deren Lösung mir nicht ganz klar ist. Es wäre toll, wenn mir jemand erklären könnte, warum manche Dinge so sind, wie sie sind ;-)
Dieses Programm bricht allerdings schon nach zwei eingelesenen Zeilen ab. Funktionieren tut es allerdings, wenn man den fgets Aufruf im zweiten Argument mit der Größe des Puffers füttert, also fgets(buf, sizeof(buf), stdin);
Warum ist das so?
Wie könnte man also die letzte Phase der Initialisierung mittels memset() realisieren?
bei einer kleinen Programmieraufgabe stieß ich unvermittelt auf drei mir unbekannte Problemfälle, deren Lösung mir nicht ganz klar ist. Es wäre toll, wenn mir jemand erklären könnte, warum manche Dinge so sind, wie sie sind ;-)
- fgets: Angenommen man möchte von der Standardeingabe eine gewisse Anzahl Zeilen in einen Puffer einlesen, interessiert sich aber nur für die ersten m Zeichen. Ein intuitives Codefragment sähe so aus:
C:
#include <stdlib.h>
#include <stdio.h>
int main()
{
char buf[100], a[3][4];
int rows = 3, cols = 4, i, j;
for (i = 0; i < rows; ++i) {
fgets(buf, cols, stdin);
for (j = 0; j < cols; ++j)
a[i][j] = buf[j];
}
printf("done\n");
return 0;
}
Warum ist das so?
- memset: Wie kann man einen Speicherbereich geschickt initialisieren, wenn man mit einem dynamisch allozierten, mehrdimensionalen Array arbeitet? Folgendes Codefragment initialisiert den Speicherbereich über zwei for-Schleifen:
C:
fgets(buf, sizeof(buf), stdin);
/* take care of ASCII representation */
n = (int) buf[0] - '0';
m = (int) buf[2] - '0';
/* allocate space for point[x][y] */
point = (char **) realloc(point, n * sizeof(char *));
for (i = 0; i < m; ++i)
point[i] = realloc(point[i], m * sizeof(char));
/* initialization */
for (i = 0; i < n; ++i)
for (j = 0; j < m; ++j)
point[i][j] = '.';
- malloc/realloc: In einer Endlosschleife möchte ich immer eine gewisse Anzahl Zeilen von stdin einlesen; dafür muss ich Speicher entsprechend allozieren und am Ende der Schleife wieder freigeben. Intuitiv habe ich dafür mit malloc() und free() gearbeitet, allerdings segmentiert nach ein paar Eingaben mein Programm. Funktionieren tut es allerdings mittels realloc(), so wie in obigem Codefragment schon gezeigt.
Was ist denn daran falsch, am Beginn der Schleife ein malloc() statt eines realloc() auszuführen, wenn man am Ende sowieso den Speicher mittels free() wieder freigibt?