LINUX.ORG.RU

[C++] Ошибка сегментации

 


0

0

Есть программа, которая проверяет, есть ли ~/sample, и если нет, то создает такой каталог, иначе сообщает, что это каталог или не каталог

~/programming/sample $ cat sample.cpp
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<pwd.h>
#include<string.h>
#include<stdio.h>
int main()
{
struct passwd *user;
struct stat *dir;
char *name = "";
user = getpwuid( getuid());
name = user->pw_dir;
strcat( name, "/sample");
if ( stat( name, dir) == -1)
{
printf( "folder %s doesn't exists, creating\n", name);
mkdir( name, 0755);
}
else
{
if ((dir->st_mode & S_IFDIR) != S_IFDIR)
{
printf( "%s exists and is not a folder\n", name);
}
else
{
printf( "%s exists and is folder", name);
}
}
}
~/programming/sample $ g++ sample.cpp -o sample
~/programming/sample $ ./sample
folder /home/user/sample doesn't exists, creating
~/programming/sample $ ./sample
Ошибка сегментирования
~/programming/sample $ rmdir ../../sample/
~/programming/sample $ touch ../../sample
~/programming/sample $ ./sample
Ошибка сегментирования

Объясните пожалуйста, почему происходит сегфолт?

★★★★★

> strcat( name, "/sample");

hint: man strcat hint2: the dest string must have enough space for the result

anonymous
()

Под struct stat *dir; у тебя кто память выделяет? Замени на struct stat dir; ну и соответственно stat( name, &dir)

Reset ★★★★★
()

Сделай gdb sample, потом run и ещё потом backtrace после сегфолта, может что нибудь полезное отладчик покажет:)

mint
()

Потому что ты не знаешь Си/С++. Учи язык. Функция stat заполняет память на которую указывает передаваемый ей указатель dir. А у тебя dir никуда не указывает и содержит мусор со стека.

Замени struct stat *dir; на struct stat dir; и поменяй соответственно вызовы где этот указатель использовался, а также обращения к членам структуры.

Может быть у тебя ещё ошибки есть, я увидел только первую и написал. Учи язык внимательно!

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.