nntp2http.com
Posting
Suche
Optionen
Hilfe & Kontakt

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
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