Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2013, 18:15   #1
Joose
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 67
По умолчанию Функция заполнения динамического массива

Всем привет. Неожиданно для себя столкнулся с проблемой при работе с динамическими массивами. Задачка требует заполнить три массива значениями типа int:
Код:
#include <stdio.h>
#include <stdlib.h>
#include "locale.h"
#include <conio.h>

int* input(void);

int main()
{
    int *A, *B, *C;
    setlocale(LC_ALL, "Russian");
    printf("Программа обеспечивает ввод трех множеств и выполнение над ними операций");
    printf("объединения, пересечения, разности и симметрической разности\n");
    printf("Для окончания ввода элементов множества введите -100\n");
    printf("Введите первое множество:\n");
    A = input();
    printf("Введите второе множество:\n");
    B = input();
    printf("Введите третье множество:\n");
    C = input();
    return 0;
}

int* input(void)
{
    int i = 0, *A = NULL, number;
    for(i = 0; number != -100; i++)
    {
        A = (int*)realloc(A, (i + 1) * sizeof(int));
        scanf("%d", &number);
        if(number == -100)
            break;
        A[i] = number;
    }
    A[i] = '\0';
    return A;
}
Задачу заполнения массива выполняет функция input. Для первого массива она работает замечательно, все прекрасно заполняется и при надобности выводится на печать. При вызове же функции для заполнения второго массива (а я уверен что и для третьего повторится та же ситуация) программа выдает ошибку. Но я ума не приложу в чем она заключается, прошу помощи.
Joose вне форума Ответить с цитированием
Старый 05.03.2013, 18:32   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Код:
    for(i = 0; number != -100; i++)
    {
        A = (int*)realloc(A, (i + 1) * sizeof(int));
Мама...
По делу - у Вас number не инициализирована, поэтому может случайно оказаться с самого начала равной -100, после чего получите обращение по нулевому адресу.
Abstraction вне форума Ответить с цитированием
Старый 05.03.2013, 18:52   #3
Joose
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 67
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Код:
    for(i = 0; number != -100; i++)
    {
        A = (int*)realloc(A, (i + 1) * sizeof(int));
Мама...
По делу - у Вас number не инициализирована, поэтому может случайно оказаться с самого начала равной -100, после чего получите обращение по нулевому адресу.
Хм, и вправду помогло. Но неужели number каждый раз оказывалась равной -100? Ведь после выполнения функции значения в переменных теряются. Может быть потому, что мой компьютер после исполнения функции не использовал данную ячейку памяти, и поэтому значение в ней сохранилось?
Joose вне форума Ответить с цитированием
Старый 05.03.2013, 20:21   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Joose Посмотреть сообщение
Хм, и вправду помогло. Но неужели number каждый раз оказывалась равной -100? Ведь после выполнения функции значения в переменных теряются. Может быть потому, что мой компьютер после исполнения функции не использовал данную ячейку памяти, и поэтому значение в ней сохранилось?
1. Пошаговая отладка - твой лучший друг.
2. Если не помог пункт первый - используй логгирование.

Логгирование - вывод значения нужной теперь переменной перед потенциальным местом поломки.


зы: утечки памяти они такие...
_Bers вне форума Ответить с цитированием
Старый 05.03.2013, 21:18   #5
Joose
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 67
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
1. Пошаговая отладка - твой лучший друг.
2. Если не помог пункт первый - используй логгирование.

Логгирование - вывод значения нужной теперь переменной перед потенциальным местом поломки.


зы: утечки памяти они такие...
Хм, оказывается я использовал логгирование сам того не подозревая )) А вот как делать пошаговую отладку в Code Block я, к сожалению не знаю. Что ж, всем спасибо за помощь.
Joose вне форума Ответить с цитированием
Старый 05.03.2013, 23:25   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Хм, и вправду помогло. Но неужели number каждый раз оказывалась равной -100? Ведь после выполнения функции значения в переменных теряются.
"Теряются" - это не "перезаписываются случайными значениями, равномерно распределёнными по всему диапазону значений". В частности, может получаться так, что при повторном входе в функцию значения некоторых её локальных переменных останутся такими же, какими они были при выходе из функции. Если бы программа преподносила такой сюрприз не всегда, а один раз из тысячи, она бы не стала от этого правильнее - просто ошибку было бы тяжелее отловить.
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция проверки заполнения полей DIMASIKXXX32 Общие вопросы Delphi 3 21.11.2012 00:09
Функция заполнения динамического массива случайными числами Beren42 Помощь студентам 3 16.10.2012 10:40
функция рандомного заполнения двумерного массива (с) Miles Помощь студентам 1 08.01.2012 14:35
заполнения двумерного массива С++ Caнёk Помощь студентам 10 26.10.2010 17:24