LINUX.ORG.RU

Segmentation fault ,,,, why :(


0

0

#include <stdio.h>
#include <string.h>

main()
{
char pathToConfFile[]="/1/";
char fileName[]="file.txt";
char fileNameAfterRename[]="file.txt.old";
char *pathFile=strcat(pathToConfFile, fileName);
char *pathFileRename=strcat(pathToConfFile, fileNameAfterRename);
if(fopen(pathFile, "r")!=NULL)
{
fputs("Arsen\n", fopen(pathFile, "w"));
}
else
{
rename(pathFile, pathFileRename);
fputs("Arsen\n", fopen(pathFile, "w"));
}
}


компилится без проблем но при выполнении выводит Segmentation fault
в чем ошибка ?


> xalyavshik (*)

Оно то и видно. Дебагером пользоваться умеешь? Если да - пользуйся, если нет - пшел расставлять проверки на то, что *все* вызовы функций, например fopen(pathFile, "w"), отработали успешно.

gods-little-toy ★★★
()

Видимо, ты не понимаешь что делает strcat. Он дописывает одну строку к другой: "the dest string must have enough space for the result". Короче, man strcat.

true_admin ★★★★★
()
Ответ на: комментарий от gods-little-toy

> пшел расставлять проверки на то, что *все* вызовы функций, например fopen(pathFile, "w"), отработали успешно.

как раз в данном примере это не вызовет segfault никак. Тут дело в испорченной памяти.

PS юзайте valgrind

true_admin ★★★★★
()

char *pathFile=strcat(pathToConfFile, fileName); 

Ошибка здесь. Учите С, это азы.

Legioner ★★★★★
()

Ошибка в непонимании, как работает функция strcat. В частности того, что выделять память под результат она за тебя не будет.

anonymous
()

>в чем ошибка ?

ошибка в том, что вы поленились прочесть хотя бы одну книгу по Си.

>char pathToConfFile[]="/1/";

создает память только под строку "/1/". и не больше. пытаясь приписать еще что-то в конец, strcat лезет в невыделенную для этого память.

xydo ★★
()

ах, да, еще... сразу не обратил внимание.

>char *pathFile=strcat(pathToConfFile, fileName); >char *pathFileRename=strcat(pathToConfFile, fileNameAfterRename);

man strcat

xydo ★★
()
Ответ на: комментарий от s0L

Нет, это мутабельный массив. Это синтаксический сахар для char pathToConfFile[4] = {'/', '1', '/', 0};

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