Форум программистов, компьютерный форум CyberForum.ru

Ошибка сегментирования - C++

Восстановить пароль Регистрация
 
korrav
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 21
10.03.2012, 16:53     Ошибка сегментирования #1
Здравствуйте. Здесь представлена программа, единственное назначение которой промоделировать поведение другой более сложной программы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
struct test
{
    int count;
    int mode;
    int sampl [3];
} ec, *ec_point=NULL;
int* psampl;
void func( void**);
int main()
{
    int** ptsampl=NULL;
    func(reinterpret_cast< void**>(ptsampl));
    *ptsampl-=2;
        ec_point=reinterpret_cast<struct test*>(*ptsampl);
    printf("cont =%d\nmode =%d\nsampl =%d %d %d\n", ec_point->count, ec_point->mode, ec_point->sampl[0], ec_point->sampl[1], ec_point->sampl[2]);
    return 0;
}
 
void func( void** arg)
{
    for (int i=0; i<3; i++) ec.sampl[i]=i;
    ec.count =0;
    ec.mode=2;
    psampl= ec.sampl;
    arg = reinterpret_cast< void**>(&psampl);
    return;
}
Программа создается без ошибок. Однако при попытке выполнения выскакивает сообщение: Ошибка сегментирования. Пока не могу понять причину этой ошибки. Поэтому надеюсь на вашу помощь. Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2012, 16:53     Ошибка сегментирования
Посмотрите здесь:

Ошибка сегментирования (core dumped) C++
C++ C++ Ошибка сегментирования
C++ Ошибка сегментирования.
ошибка сегментирования C++
Ошибка сегментирования C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
10.03.2012, 16:59     Ошибка сегментирования #2
в строчке 14 переменная ptsampl указывает на NULL, а вы ее разыменовываете.
функция func ее не изменяет как вы возможно того ожидали.

C++
1
 arg = reinterpret_cast< void**>(&psampl); // это изменение локального указателя.
korrav
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 21
10.03.2012, 17:26  [ТС]     Ошибка сегментирования #3
Спасибо за ответ.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
10.03.2012, 17:31     Ошибка сегментирования #4
проблема не с psampl, а с ptsampl, значение которой передается в функцию func. внутри этой функции идет работа с переменной с именем arg. так вот запись arg = 0; не изменяет то, на что будет указывать ptsampl.

вот простая аналогия:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//если хотите, чтобы функция меняла переменную инт, передавайте ее в функцию по указателю:
 
void f(int* pInt) {*pInt = 0; }
 
int i = 0;
f(&i);
 
 
// если хотите, чтобы функция изменяла переменную типа int*, передавайте ее в функцию
// по указателю
void f(int** ppInt)  {*ppInt = 0; }
 
int* pInt;
f(&pInt);
 
// если хотите, чтобы функция изменяла переменную типа int**, передавайте ее в функцию
// по указателю
void f(int*** pppInt) {*pppInt = 0; }
 
int** ppInt;
f(&ppInt);
korrav
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 21
10.03.2012, 17:35  [ТС]     Ошибка сегментирования #5
Спасибо ещё раз. Всё понятно.
Yandex
Объявления
10.03.2012, 17:35     Ошибка сегментирования
Ответ Создать тему
Опции темы

Текущее время: 01:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru