Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Область видимости и время жизни 
:(
    Опции темы
konshyn
Дата 2.10.2014, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Сначала код. Потом вопрос, который не могу решить. Он в пару строк:)

файл A.h
Код

#ifndef __A_H__
#define __A_H__

struct A;

struct A *a_init(int cnt);
int use(struct A *a);

#endif /* __A_H__ */



Файл А.с
Код

#include <stdlib.h>
#include <stdio.h>
#include "A.h"

struct A {
    int a[10];
    int *b;
    int c;
    int cnt;
};

static struct A *_a;

struct A *a_init(int cnt) {
    _a = calloc(cnt, sizeof(struct A));
    int i;
    for (i = 0; i < cnt; i++)
        _a[i].b = calloc(cnt*cnt, sizeof(int));

    for (i = 0; i < cnt; i++) {
        _a[i].c = i*i*i;
        _a[i].cnt = cnt;
        int j;
        for (j = 0; j < cnt * cnt; i++)
            _a[i].b[j] = j * 3; 
    }
    return _a;
}

int use(struct A *a) {
    int i;
    int cnt = a[0].cnt;
    for (i = 0; i < cnt; i++) {
        printf("%d \n", a[i].c);
        int j;
        for (j = 0; j < cnt * cnt; i++) 
            printf("%d ", a[i].b[j]);
        printf("\n\n\n");
    }
}


Файл main.c
Код

#include <stdlib.h>
#include <stdio.h>
#include "A.h"

int main()
{
    const int cnt = 10;
    struct A *a = a_init(cnt);
    use(a);
    return 0;
}


Я хочу сделать в стиле сишных библиотек свою. Есть функция, которая инициализирует структуру и возвращает на нее указатель. А потом передавать этот указатель в другие функции, которые будут что-то делать, скрывая свои действия от пользователя, и возвращать результат. как это происходит в libnet, mysql-client и т.п.

В коде, что выше, я показал пример. Но в функции use() происходи segmentation fault. 
Не могу разобраться. помогите, плиз


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
baldina
Дата 2.10.2014, 23:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



оно до use доходит? <line 24>
Цитата(konshyn @  2.10.2014,  21:46 Найти цитируемый пост)
 for (j = 0; j < cnt * cnt; i++)


но если и доходит, то <line 36>
Цитата(konshyn @  2.10.2014,  21:46 Найти цитируемый пост)
 for (j = 0; j < cnt * cnt; i++) 


а в остальном, прекрасная маркиза, все хорошо, все хорошо
PM MAIL   Вверх
konshyn
Дата 3.10.2014, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(baldina @  2.10.2014,  23:38 Найти цитируемый пост)
а в остальном, прекрасная маркиза, все хорошо, все хорошо 

Сначала нашел ошибку, а потом только открыл Ваш код:)
А вообще, забавное совпадение с ошибкой, хотя причины разные.

этот код всего лишь миниатюрная версия того, что я написал и где сделал ошибку. и здесь тоже - по невнимательности.

в своей библиотеке тоже нашел ошибку.
мини-код:

Код

int push_in_new_cell(struct A *new_cell) {
    new_cell = get_new_cell();  // возвращает адрес свободной ячейки
    new_cell->.....
    //тут заполнение новой ячейки
    return 0;
}

int push() {
    struct A *cell = NULL;
    push_in_new_cell(cell);
    cell->....  // тут и происходил segmentation fault
}


думаю, что знающие поняли ошибку.
а незнающие, если интересно, пусть подумают.
если никто не объяснит в комментариях ошибку, то позже разъясню.


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
baldman88
Дата 3.10.2014, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: 3
Всего: 7



И, если не секрет, где здесь ошибка?
Если функция get_new_cell возвращает нормальный указатель (а вдруг она вернет NULL), то, по идее, все должно работать. В противном случае сегфолт будет в функции push_in_new_cell.
При работе с указателями лучше всегда проверять их на валидность перед использованием.
PM MAIL   Вверх
konshyn
Дата 3.10.2014, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(baldman88 @  3.10.2014,  14:12 Найти цитируемый пост)
Если функция get_new_cell возвращает нормальный указатель (а вдруг она вернет NULL),

get_new_cell всегда возвращает валидный указатель. 

все дело в передаче указателя cell из функции push() в функци. push_in_new_cell()

Добавлено через 1 минуту и 10 секунд
P.S. Если бы функция get_new_cell возвращала когда-либо невалидный указатель, то в сообщение я бы включил и ее код.


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
baldina
Дата 4.10.2014, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



baldman88, параметры передаются по значению
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0470 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.