Frage zu Zeigervektoren
Von: Thomas Barth (txbarth@web.de) [Profil]
Datum: 28.04.2008 20:46
Message-ID: <67mkbkF2o5t5pU1@mid.individual.net>
Newsgroup: de.comp.lang.c
Datum: 28.04.2008 20:46
Message-ID: <67mkbkF2o5t5pU1@mid.individual.net>
Newsgroup: de.comp.lang.c
Hallo,
ich möchte Dateinamen aus einem Verzeichnis nach bestimmten Kritieren in
einen Zeigervektor einlesen. Ist es richtig, dass ich hier mit malloc
arbeiten muss und jedesmal, wenn ich Dateien neu in den Zeigervektor
einlese, vorhier free() drüberlaufen lassen muss und natürlich zum
Programmende? Hier nur mal ein Beispiel:
char *sms_visi_queue[MAX_SMSVISIS];
int main(void) {
// es kann sein, dass zur Laufzeit folgende Funktion
// mehrmals aufgerufen
fillSMSVisiQueue(sms_visi_queue, 2);
fillSMSVisiQueue(sms_visi_queue, 3);
fillSMSVisiQueue(sms_visi_queue, 4);
freeSpace();
return EXIT_SUCCESS;
}
void fillSMSVisiQueue(char **sms_visi_queue, int key) {
DIR *dir;
struct dirent *direntry;
struct stat attribut;
char file[STRLEN] = "",
filebasename[STRLEN] = "";
char *newstring;
key = key - 2;
if(0 > key) {
key = 0;
}
int i, filecnt = 0;
//hier bereits free verwenden?
for (i = 0; i < MAX_SMSVISIS; ++i) {
if(NULL != sms_visi_queue[i]) free(sms_visi_queue[i]);
}
if((dir = opendir(SMSVISI_DIR)) != NULL) {
while((direntry = readdir(dir)) != NULL) {
snprintf(filebasename, STRLEN, "%s", (*direntry).d_name);
snprintf(file, STRLEN, "%s/%s", SMSVISI_DIR, filebasename);
if(filecnt < MAX_SMSVISIS) {
stat(file, &attribut);
if(attribut.st_mode & S_IFREG) {
for (i = 0; i < 4; i++) {
if(chargroups[key][i] == tolower(filebasename[0])) {
//hier mit malloc speicher reservieren?
newstring = (char *) malloc(strlen(filebasename) *
sizeof(char) +1);
if(NULL != newstring) {
strcpy(newstring, filebasename);
sms_visi_queue[filecnt] = newstring;
filecnt++;
break;
}
}
}
}
} else {
break;
}
}
closedir(dir);
//der Rest soll mit einem Leerstring initialisiert werden
for (i = filecnt; i < MAX_SMSVISIS; ++i) {
newstring = (char *) malloc(sizeof(char) +1);
strcpy(newstring, "");
sms_visi_queue[i] = newstring;
}
}
}
void freeSpace() {
int i;
for (i = 0; i < MAX_SMSVISIS; ++i) {
if(NULL != sms_visi_queue[i]) free(sms_visi_queue[i]);
}
}
Wäre schön, ob mir jemand sagen könnte, ob man das so machen kann.
Viele Grüße,
Thomas B
[ Auf dieses Posting antworten ]Antworten
- Thomas Richter (28.04.2008 21:23)
- Jirka Klaue (28.04.2008 21:47)
