Как правильно решить задачу?
От: barmal  
Дата: 08.07.05 11:08
Оценка:
Вот такой вот код, после компиляции g++ ом выпадает все время в корку.


#include <stdio.h>

int main () {
   static int arr [] = {1, 7, 4, 45, 31, 20, 57, 11};
   int i; long sum;
   for ( i = 0, sum = 0L;
       i < (sizeof(arr)/sizeof(int)); i++ )
       sum += arr[i];
       printf ("Среднее значение = %ld\n", sum/8);

   //А теперь то же саое, но через указатели
   int *i1;
   long *sum1;

   for ( *i1=0, *sum1 = 0L;
         *i1 < sizeof(arr)/sizeof(int); *i1 = *i1 + 1  )
       *sum1 = *sum1 + *(arr+*i1);
   printf ("Среднее значение через указатели = %ld\n", *sum1/8);
   return 0;
}


Кмпилирую и линкую так:
g++ -c test.cpp -g
g++ -o test test.o

Ничего не могу понять.
Объясните, что делается не правильно.

gdb показывает, что после объявления long *sum1, указатель ссылается на адрес 0х0
и после обращения к нему похоже программа и выдает сегментешион фаулт.
Иногда шаманством со строками удавалось сделать не выпадающий в корку бинарник, но это не выход.
Хочется понять, ведь что-то принципиально не правильно в этом коде.
Как правильно объявлять и инициализировать указатели?
Re: Как правильно решить задачу?
От: VsevolodC Россия  
Дата: 08.07.05 11:14
Оценка: +1
Здравствуйте, barmal, Вы писали:
B>Как правильно объявлять и инициализировать указатели?
Указатель должен на что-то указывать...
Попробуй, например, так:
int *i1 = &i;
long *sum1 = &sum;
Re: Как правильно решить задачу?
От: Wasilij  
Дата: 08.07.05 11:20
Оценка:
Здравствуйте, barmal, Вы писали:

B>Вот такой вот код, после компиляции g++ ом выпадает все время в корку.


B>

B>#include <stdio.h>

B>int main () {
B>   static int arr [] = {1, 7, 4, 45, 31, 20, 57, 11};
B>   int i; long sum;
B>   for ( i = 0, sum = 0L;
B>       i < (sizeof(arr)/sizeof(int)); i++ )
B>       sum += arr[i];
B>       printf ("Среднее значение = %ld\n", sum/8);

B>   //А теперь то же саое, но через указатели
B>   int *i1;
B>   long *sum1;

B>   for ( *i1=0, *sum1 = 0L;
B>         *i1 < sizeof(arr)/sizeof(int); *i1 = *i1 + 1  )
B>       *sum1 = *sum1 + *(arr+*i1);
B>   printf ("Среднее значение через указатели = %ld\n", *sum1/8);
B>   return 0;
B>}

B>


B>Кмпилирую и линкую так:

B>g++ -c test.cpp -g
B>g++ -o test test.o

B>Ничего не могу понять.

B>Объясните, что делается не правильно.

B>gdb показывает, что после объявления long *sum1, указатель ссылается на адрес 0х0

B>и после обращения к нему похоже программа и выдает сегментешион фаулт.
B>Иногда шаманством со строками удавалось сделать не выпадающий в корку бинарник, но это не выход.
B>Хочется понять, ведь что-то принципиально не правильно в этом коде.
B>Как правильно объявлять и инициализировать указатели?



int *i1; // указатель на место в памяти ничем не проинициализирован
*i1=0 // запись в память по непроинициализированному указателю

Нарисуй картинки, сразу все поймешь.
Re: Как правильно решить задачу?
От: MyNickName Украина  
Дата: 08.07.05 12:58
Оценка:
Здравствуйте, barmal, Вы писали:

B>Вот такой вот код, после компиляции g++ ом выпадает все время в корку.


B>

B>#include <stdio.h>

B>int main () {
B>   static int arr [] = {1, 7, 4, 45, 31, 20, 57, 11};
B>   int i; long sum;
B>   for ( i = 0, sum = 0L;
B>       i < (sizeof(arr)/sizeof(int)); i++ )
B>       sum += arr[i];
B>       printf ("Среднее значение = %ld\n", sum/8);

B>   //А теперь то же саое, но через указатели
B>   int *i1;
B>   long *sum1;

B>   for ( *i1=0, *sum1 = 0L;
B>         *i1 < sizeof(arr)/sizeof(int); *i1 = *i1 + 1  )
B>       *sum1 = *sum1 + *(arr+*i1);
B>   printf ("Среднее значение через указатели = %ld\n", *sum1/8);
B>   return 0;
B>}

B>


B>Кмпилирую и линкую так:

B>g++ -c test.cpp -g
B>g++ -o test test.o

B>Ничего не могу понять.

B>Объясните, что делается не правильно.

B>gdb показывает, что после объявления long *sum1, указатель ссылается на адрес 0х0

B>и после обращения к нему похоже программа и выдает сегментешион фаулт.
B>Иногда шаманством со строками удавалось сделать не выпадающий в корку бинарник, но это не выход.
B>Хочется понять, ведь что-то принципиально не правильно в этом коде.
B>Как правильно объявлять и инициализировать указатели?


int *i1 = new int;
long *sum1 = new long;
Re: Как правильно решить задачу?
От: Teolog Россия  
Дата: 11.07.05 08:56
Оценка:
Здравствуйте, barmal, Вы писали:

B> int *i1;

B> long *sum1;
B> *i1=0; *sum1 = 0L;
И праильно падает ибо нефиг.
Ты сначала присвой чего нибудь самому указателю а уж потом пиши по нему.
i1=arr; или i1=&arr[0];
А sum1 вообще не должен быть указателем, или я ошибаюсь?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.