Segmentation fault на точке выхода
От: Bystrii_Lis  
Дата: 30.01.12 11:44
Оценка:
Сразу укажу специфику машины на Solaris:
Machine hardware: sun4u
OS version: 5.10
Processor type: sparc
Hardware: SUNW,Sun-Fire-V890
Компилятор: cc Sun C 5.9 SunOS_sparc Patch 124867-06 2008/06/10

Простенькая программа чтения строки из файла в структуру:
> cat ttt2.c
#include <stdio.h>

typedef struct {
char newr[106];
char newq[15];
} fgrt_t;

int main()
{
   FILE *USFILE;
   fgrt_t *usrec;

   char *usfile="ugd.dat";

   USFILE=fopen(usfile,"rb");
   printf("1\n");
   fread(usrec,sizeof(fgrt_t),1,USFILE);
   printf("2\n");
   fclose(USFILE);
   printf("3\n");
   printf("newq: :%15s:\n", usrec->newq);
   printf("4\n");

   return 0;
}

Размер файла "ugd.dat" — 1216 байт. Прога компилится без ошибок, но выдаёт следующее:
> ./ttt2
1
2
3
newq: :250991100000179:
4
Segmentation fault (core dumped)

Есть какие-нибудь идеи?

30.01.12 19:48: Перенесено из 'C/C++'
segmentation fault solaris struct fread
Re: Segmentation fault на точке выхода
От: Сергей Мухин Россия  
Дата: 30.01.12 11:48
Оценка: 1 (1)
Здравствуйте, Bystrii_Lis, Вы писали:

B_L> fgrt_t usrec;
---
С уважением,
Сергей Мухин
Re: Segmentation fault на точке выхода
От: DarkTranquillity  
Дата: 30.01.12 11:52
Оценка: :)
Здравствуйте, Bystrii_Lis, Вы писали:

B_L>Сразу укажу специфику машины на Solaris:

B_L>Machine hardware: sun4u
B_L>OS version: 5.10
B_L>Processor type: sparc
B_L>Hardware: SUNW,Sun-Fire-V890
B_L>Компилятор: cc Sun C 5.9 SunOS_sparc Patch 124867-06 2008/06/10

B_L>Простенькая программа чтения строки из файла в структуру:

B_L>
>> cat ttt2.c
B_L>#include <stdio.h>

B_L>typedef struct {
B_L>char newr[106];
B_L>char newq[15];
B_L>} fgrt_t;

B_L>int main()
B_L>{
B_L>   FILE *USFILE;
B_L>   fgrt_t *usrec;

B_L>   char *usfile="ugd.dat";

B_L>   USFILE=fopen(usfile,"rb");
B_L>   printf("1\n");
B_L>   fread(usrec,sizeof(fgrt_t),1,USFILE);
B_L>   printf("2\n");
B_L>   fclose(USFILE);
B_L>   printf("3\n");
B_L>   printf("newq: :%15s:\n", usrec->newq);
B_L>   printf("4\n");

B_L>   return 0;
B_L>}
B_L>

B_L>Размер файла "ugd.dat" — 1216 байт. Прога компилится без ошибок, но выдаёт следующее:
B_L>
>> ./ttt2
B_L>1
B_L>2
B_L>3
B_L>newq: :250991100000179:
B_L>4
B_L>Segmentation fault (core dumped)
B_L>

B_L>Есть какие-нибудь идеи?

Со спецификой Никсов плохо знаком, но я бы как минимум сделал выравнивание структуры на 1 байт. Хотя это к делу не относится, скорее всего.
Re: Segmentation fault на точке выхода
От: Какая разница Украина  
Дата: 30.01.12 11:56
Оценка:
Здравствуйте, Bystrii_Lis, Вы писали:

B_L>Сразу укажу специфику машины на Solaris:

B_L>Machine hardware: sun4u
B_L>OS version: 5.10
B_L>Processor type: sparc
B_L>Hardware: SUNW,Sun-Fire-V890
B_L>Компилятор: cc Sun C 5.9 SunOS_sparc Patch 124867-06 2008/06/10

B_L>Простенькая программа чтения строки из файла в структуру:

B_L>
>> cat ttt2.c
B_L>#include <stdio.h>

B_L>typedef struct {
B_L>char newr[106];
B_L>char newq[15];
B_L>} fgrt_t;

B_L>int main()
B_L>{
B_L>   FILE *USFILE;
B_L>   fgrt_t *usrec;

B_L>   char *usfile="ugd.dat";

B_L>   USFILE=fopen(usfile,"rb");
B_L>   printf("1\n");
B_L>   fread(usrec,sizeof(fgrt_t),1,USFILE);
B_L>   printf("2\n");
B_L>   fclose(USFILE);
B_L>   printf("3\n");
B_L>   printf("newq: :%15s:\n", usrec->newq);
B_L>   printf("4\n");

B_L>   return 0;
B_L>}
B_L>

B_L>Размер файла "ugd.dat" — 1216 байт. Прога компилится без ошибок, но выдаёт следующее:
B_L>
>> ./ttt2
B_L>1
B_L>2
B_L>3
B_L>newq: :250991100000179:
B_L>4
B_L>Segmentation fault (core dumped)
B_L>

B_L>Есть какие-нибудь идеи?

Указатель usrec мусорный
!0xDEAD
Re[2]: Segmentation fault на точке выхода
От: Bystrii_Lis  
Дата: 30.01.12 11:56
Оценка: :)
Здравствуйте, Сергей Мухин, Вы писали:

СМ>Здравствуйте, Bystrii_Lis, Вы писали:


B_L>> fgrt_t usrec;



Тогда и структуру по ссылке надо передавать и принт через указатель делать. А это в рамках заданной архитектуры не гуд. Кстати, так работает, да. Через указатель значит нельзя?
Re[3]: Segmentation fault на точке выхода
От: Сергей Мухин Россия  
Дата: 30.01.12 11:57
Оценка:
Здравствуйте, Bystrii_Lis, Вы писали:


B_L>>> fgrt_t usrec;



B_L>Тогда и структуру по ссылке надо передавать и принт через указатель делать. А это в рамках заданной архитектуры не гуд. Кстати, так работает, да. Через указатель значит нельзя?


можно, но надо тогда память распределить
---
С уважением,
Сергей Мухин
Re: Segmentation fault на точке выхода
От: Юрий Россия  
Дата: 30.01.12 11:58
Оценка:
Здравствуйте, Bystrii_Lis, Вы писали:

B_L>Сразу укажу специфику машины на Solaris:

B_L>Machine hardware: sun4u
B_L>OS version: 5.10
B_L>Processor type: sparc
B_L>Hardware: SUNW,Sun-Fire-V890
B_L>Компилятор: cc Sun C 5.9 SunOS_sparc Patch 124867-06 2008/06/10


Думаю, что будет не лишним выделить память для usrec
Re: Segmentation fault на точке выхода
От: _NN_  
Дата: 30.01.12 11:59
Оценка: 2 (1)
B_L>
>> cat ttt2.c
B_L>#include <stdio.h>

B_L>typedef struct {
B_L>char newr[106];
B_L>char newq[15];
B_L>} fgrt_t;

B_L>int main()
B_L>{
B_L>   FILE *USFILE;
B_L>   fgrt_t *usrec;

B_L>   char *usfile="ugd.dat";

B_L>   USFILE=fopen(usfile,"rb");
B_L>   printf("1\n");
B_L>   fread(usrec,sizeof(fgrt_t),1,USFILE);
B_L>   printf("2\n");
B_L>   fclose(USFILE);
B_L>   printf("3\n");
B_L>   printf("newq: :%15s:\n", usrec->newq);
B_L>   printf("4\n");

B_L>   return 0;
B_L>}
B_L>


А кто память выделит для чтения данных ?

Хотя бы так:
fgrt_t* usrec = (fgrt_t*)malloc(sizeof(fgrt_t));

...

free(usrec)
return 0;


P.S.
Переменные не советую именовать заглавными буквами.
Обычно так именуют макросы.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Segmentation fault на точке выхода
От: Bystrii_Lis  
Дата: 30.01.12 12:26
Оценка:
Здравствуйте, _NN_, Вы писали:


_NN>А кто память выделит для чтения данных ?


_NN>Хотя бы так:

_NN>
_NN>fgrt_t* usrec = (fgrt_t*)malloc(sizeof(fgrt_t));

_NN>


_NN>P.S.

_NN>Переменные не советую именовать заглавными буквами.
_NN>Обычно так именуют макросы.

Ох ты чёрт... Спасибо!
Вот только почему он падал на точке выхода... почему не после fread?
Попробовал такой код:

int main()
{
   FILE *USFILE;
   fgrt_t *usrec;
   char *ufile="ugd_VIPR0102S1.dat";

   USFILE=fopen(ufile,"rb");
   printf("1\n");
   fread(usrec,sizeof(fgrt_t),1,USFILE);
...
   free(usrec);
   return 0;
}


Упал на fread. Компилятор проверил, что память под указатель будут освобождать?
Re[3]: Segmentation fault на точке выхода
От: AKh  
Дата: 30.01.12 13:23
Оценка:
Здравствуйте, Bystrii_Lis, Вы писали:

B_L>Здравствуйте, _NN_, Вы писали:


B_L>Вот только почему он падал на точке выхода... почему не после fread?


Так как в указателе мусор, то он может указывать куда угодно. Например, на стек.
Re: Segmentation fault на точке выхода
От: Centaur Россия  
Дата: 30.01.12 16:57
Оценка:
Здравствуйте, Bystrii_Lis, Вы писали:

>> cat ttt2.c
B_L>#include <stdio.h>

B_L>typedef struct {
B_L>char newr[106];
B_L>char newq[15];
B_L>} fgrt_t;

B_L>int main()
B_L>{
B_L>   fgrt_t *usrec;
…
B_L>   fread(usrec,sizeof(fgrt_t),1,USFILE);


Ну а кто будет память под usrec выделять? А так оно указывает в куда повезёт, и содержимое читает туда же. Естественно, что при этом перетирается что-то жизненно важное.

Простейшее исправление — поменять тип переменной usrec с fgrt_t * на fgrt_t, а в fread передавать её адрес: &usrec.
Re[3]: Segmentation fault на точке выхода
От: Vain Россия google.ru
Дата: 30.01.12 21:25
Оценка:
Здравствуйте, Bystrii_Lis, Вы писали:

B_L>Ох ты чёрт... Спасибо!

B_L>Вот только почему он падал на точке выхода... почему не после fread?
Потому-что это зависит и от операционной системы и от архитектуры. К примеру, в SPARCе в системе с общим адресным пространством, вызов фунукции по нулевому/мусорному адресу не при водит к моментальному падению, а падает только потом, причем не на какой-нить невалидной инструкции, а на невыровненных данных, да ещё и в дампе будет стек кривой. Потом ищи свищи начало вызова.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.