PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit array of char - unter C



sebbel
26-10-2003, 18:22
Hi,

ich habe folgendes Problem. Ich würde gerne eine Verzeichnisliste (sortiert ausgeben).
Doch wenn ich das Programm so kompiliere, wie ich es hier abgebildet habe, so bekomme ich nach dem Ausführen immer ein Speicherzugriffsfehler.
Ich konnte den Fehler mitlerweile einkreisen auf die Zeile mit
test[i]=(*dirzeiger).d_name;
jedoch weiß ich nicht, wie ich es anders realisieren sollte einen "Stack" aus char * zu erstellen !?

Ich hoffe einer von Euch kann mir helfen, wie man ein Array aus Zeichenketten erstellt und benutzt.

Ich danke Euch für Eure Hilfe

Gruß

Sebastian


t#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
#include <stdlib.h>

int main()
{
DIR *dir;
struct dirent *dirzeiger;
char * test[]={};
int maxi=0,i=0;
if((dir=opendir("/usr")) != NULL) {
while((dirzeiger=readdir(dir)) != NULL) {
test[i]=(*dirzeiger).d_name;
i++;
}
maxi=i;
closedir(dir);
// Sortieren
char *temp="test";
int j = 0;
for(i=0; i<maxi; i++)
{
for(j=i+1; j<maxi; j++)
{
if((strcmp(test[i],test[j])>0))
{
temp=test[i];
test[i]=test[j];
test[j]=temp;
}
}
}
// Ausgabe
for (i=0;i<maxi;i++) printf("%s\n",test[i]);

printf("Dateien : %i\n",maxi);
}
else {
printf("Konnte Verzeichnis nicht öffnen");
}
return (0);
}

Lin728
26-10-2003, 18:33
Is schon ein wenig lange her, dass ich wirklich mit C gearbeitet habe, also bitte nicht böse sein, wenn alles was ich da sage quatsch ist....

Soweit ich sehe, versuchst du an ein leeres Array werte zuzuweisen.

char * test[]={};Wäre schon O.K. aber leider ist dieses Array 0 pointer lange.

Wenn du jetzt mit


test[i]=(*dirzeiger).d_name;
dem [i] elemnt den Wert des Pointers zuweißt, gibt es eine Speicherzugriffsverletzung, da das Array 0 lang ist und du auf i zugreiftst.

Silver
26-10-2003, 18:35
Die hast ein Array von Pointern erstellt (char *test]) und aber da dirzeiger jedes mal verändert wird, wirst du am Ende von der Schleife, den letzten Wert immer drinnen stehen haben! Machs mit strcpy, oder ähnlich!

mfG

wraith
26-10-2003, 18:36
Du brauchst erstmal ein Array von Zeigern auf char.
Ich hab' es hier mal mit einer festen Größe versehen,sonst mußt du das auch noch dynamisch machen.


char * test[100];

Jetzt mußt du für jeden Zeiger auch Speicher anfordern.


while((dirzeiger=readdir(dir)) != NULL)
{
test[i] = malloc(strlen((*dirzeiger).d_name) + 1);
strcpy(test[i],(*dirzeiger).d_name);
i++;
}

Da fehlt jetzt noch eine Abfrage,ob bereits alle 100 Plätze belegt sind,und am Ende muß noch der Speicher freigeben werden.

wraith
26-10-2003, 18:41
Original geschrieben von ceisserer

Soweit ich sehe, versuchst du an ein leeres Array werte zuzuweisen.

char * test[]={};Wäre schon O.K. aber leider ist dieses Array 0 pointer lange.
Das ist nicht mal gültige C Syntax,die {} dürfen nicht leer sein.
Scheint eine gnu Extension zu sein.

sebbel
26-10-2003, 19:08
hab jetzt all Eure Dinge einfließen lassen und den Speicher dynamisch mit malloc intialisiert und es funktioniert jetzt ... ich danke Euch allen erstmal für die konstruktive Hilfe.

@wraith
ja scheint so zu sein .. ich hoffe, dass es jetzt funktioniert auch auf anderen Plattformen *g*.

Nochmal herzlichen Dank :rolleyes:

Gruß

Sebastian