segmentation fault [LÖST]|Programmering / Grafisk formgivning|Forum|Nordichardware

Search
Forum Scope


Match



Forum Options



Minimum search word length is 3 characters - maximum search word length is 84 characters
Lost password?
The forums are currently locked and only available for read only access
sp_Feed sp_TopicIcon
segmentation fault [LÖST]
: : Anders : :
Kommer du hit ofta?
Medlem
Forum Posts: 506
Member Since:
January 21, 2002
sp_UserOfflineSmall Offline
1
April 14, 2005 - 8:52 am
sp_Permalink sp_Print

Hej
Jag skall skriva ett program som går igenom en katalogstruktur och kontrollerar hur mycket plats filerna tar upp. Enkelt kan tyckas men programmet är för UNIX och jag är mest van vid .NET där minneshantering inte är ngt som man behöver bekymra sig om.

Hur som helst ger programmet "segmentation fault" ibland. Jag har lyckats lokalisera felet till funktionen strcat i while-loopen. Som jag fattar det blir det för att tmpdir är för liten, men men jag kan inte förstå varför då jag gett den 1000 genom malloc.

Jag vore tacksam om någon kunde ta sig tid och förklara detta för mig.


#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <limits.h>
#include <stdio.h>
#include <string.h>


int main(int argc, char *argv[])
{
int c;
int options;
struct stat fstat;
struct dirent *dirp;
DIR *dp;
char *startdir;
char *tmpdir;

tmpdir = (char *) malloc(1000);

options = 0;
while ((c = getopt(argc, argv, "as")) != -1)
{
switch (c)
{
case 'a':
options++;
printf("a");
break;
case 's':
options++;
printf("s");
break;
default :
printf("nUsage: mdu [-a] [-s] [dir1 ...]nn");
exit(2);
}
}

/* Kontrollera om användaren har angivit namn på kataloger som skall kontrolleras */
if (argc > options+1)
{
startdir = argv[options+1];
}
else
{
startdir = "./";
}

if ( ( dp = opendir(startdir)) == NULL)
{
puts("Can not open directory");
exit(2);
}

while ( (dirp = readdir(dp)) != NULL)
{
if (strcmp(dirp->d_name, ".") == 0 || strcmp(dirp->d_name, "..") == 0)
continue;

tmpdir = strdup(startdir);
strcat(tmpdir, dirp->d_name);

printf("n%s", dirp->d_name);
}

if (closedir(dp) < 0)
puts("cant close dp");

return 0;
}

Edit: Fick hjälp från annat håll (strdup bytt mot strcpy)

Forum Timezone: Europe/Stockholm
Most Users Ever Online: 1030
Currently Online:
Guest(s) 155
Currently Browsing this Page:
1 Guest(s)
Top Posters:
Andreas Galistel: 16287
Jonas Klar: 15897
ilg@dd: 10810
Nyhet: 10607
Mind: 10550
Ctrl: 10355
Gueno: 9881
Guest: 9344
Snorch: 8881
Callister: 8468
Newest Members:
PetrbonFU PetrbonFU
Karine Bembry
Dolores Mcdaniels
Anibal McLeish
Francisca Alt
Alfie Everhart
Lester Huitt
Orlando Jorgensen
Mikki Lundgren
Dakota Kozlowski
Forum Stats:
Groups: 11
Forums: 59
Topics: 146630
Posts: 1300967

 

Member Stats:
Guest Posters: 2
Members: 79425
Moderators: 0
Admins: 11
Administrators: nordicadmin, Henrik Berntsson, Anton Karmehed, Carl Holmberg, Joel Oscarsson, Mikael Linnér, Mikael Schwartz, Andreas Paulsson, Nickebjrk, Mattias Pettersson, EmxL