Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Выделение памяти для массива указателей

66K
06 марта 2011 года
Sanka744
5 / / 28.02.2011
Доброго времени суток, столкнулся тут с проблемкой - не получается выделить память под массив указателей. В функции - в main() все ок, а вот если оператор в функции - прога вылетает с ошибкой =(
Код:
#include <stdio.h>
#include <stdlib.h>

int allocatePointersArray(int **Array, int colsNumber, int rowsNumber);


int main (int argc, const char *argv[])
{
    int **p, colsNumber = 3, rowsNumber = 3;

    //p = calloc( rowsNumber, sizeof(int *) );       // вот здесь работает
    allocatePointersArray(p, colsNumber, rowsNumber);      // а здесь уже нет

    p[0][0] = 0;
    printf("p[0][0] = %i\n", p[0][0]);

    // ...
    return 0; // main()
}

int allocatePointersArray(int **Array, int colsNumber, int rowsNumber)
{
        int i = 0;
        int *ServiceVariable;

    // Allocating Memory for Rows in Pointers Array
    Array = calloc( rowsNumber, sizeof(int *) );
    if( !Array )
    {
        perror("Method allocatePointersArray. Can't allocate memory for rows in Pointers Array\n");
        return -1;
    }

    // Trying to Allocate Solid Memory String for All Array Elements  / 1 /
    //                 or Separate Memory Stringsinstead                  / 2 /
    if( !( ServiceVariable = calloc( colsNumber * rowsNumber, sizeof(int) ) ) )
    {
        // Allocate separate memory strings                            / 1 /
        free(ServiceVariable);
        for( i = 0; i < rowsNumber; ++i )
        {
            Array = calloc( colsNumber, sizeof(int) );
        }
    }
    else
    {
        // Allocate solid memory string                               / 2 /
        free(ServiceVariable);
        for( i = 0; i < rowsNumber; ++i )
        {
            Array = calloc( colsNumber, sizeof(int) );
        }
    }

    return 0;
} // allocatePointersArray()
278
06 марта 2011 года
Alexander92
1.1K / / 04.08.2008
Цитата: Sanka744

Код:
if( !( ServiceVariable = calloc( colsNumber * rowsNumber, sizeof(int) ) ) )
    {
        // Allocate separate memory strings                            / 1 /
        free(ServiceVariable);
        for( i = 0; i < rowsNumber; ++i )
        {
            Array = calloc( colsNumber, sizeof(int) );
        }
    }
    else
    {
        // Allocate solid memory string                               / 2 /
        free(ServiceVariable);
        for( i = 0; i < rowsNumber; ++i )
        {
            Array = calloc( colsNumber, sizeof(int) );
        }
    }



А в чем разница между if и else? Если не ошибаюсь, там абсолютно одинаковый код прописан.
На какой строке ошибка вылетает?

66K
06 марта 2011 года
Sanka744
5 / / 28.02.2011
Да, код одинаковый. if !...) проверяет можно ли выделить память одним куском - иначе раздельными кусочками. Вылетает если память выделяется внутри функции

 
Код:
// Allocating Memory for Rows in Pointers Array
Array = calloc( rowsNumber, sizeof(int *) );


Эта же строка в main() уже работает ( раскомментированная, а соответствующий код в функции естественно закомментированный )
 
Код:
//p = calloc( rowsNumber, sizeof(int *) );       // вот здесь работает
278
06 марта 2011 года
Alexander92
1.1K / / 04.08.2008
Код:
#include <stdio.h>
#include <stdlib.h>

int allocatePointersArray(int ***Array, int colsNumber, int rowsNumber);


int main (int argc, const char *argv[])
{
    int **p = NULL, colsNumber = 3, rowsNumber = 3;

    allocatePointersArray(&p, colsNumber, rowsNumber);      // а здесь уже нет

    p[0][0] = 0;
    printf("p[0][0] = %i\n", p[0][0]);

    free((void*)p);
    // ...
    return 0; // main()
}

int allocatePointersArray(int ***Array, int colsNumber, int rowsNumber)
{
        int i = 0;
        int *ServiceVariable;

    // Allocating Memory for Rows in Pointers Array
    *Array = (int**)calloc( rowsNumber, sizeof(int *) );
    printf("0x%x\n", *Array);
    getchar();
    if( !*Array )
    {
        perror("Method allocatePointersArray. Can't allocate memory for rows in Pointers Array\n");
        return -1;
    }

    // Trying to Allocate Solid Memory String for All Array Elements  / 1 /
    //                 or Separate Memory Stringsinstead                  / 2 /
    if( !( ServiceVariable = (int*)calloc( colsNumber * rowsNumber, sizeof(int) ) ) )
    {
        // Allocate separate memory strings                            / 1 /
        free(ServiceVariable);
        for( i = 0; i < rowsNumber; ++i )
        {
            *(*Array+i) = (int *)calloc( colsNumber, sizeof(int) );
        }
    }
    else
    {
        // Allocate solid memory string                               / 2 /
        free(ServiceVariable);
        for( i = 0; i < rowsNumber; ++i )
        {
            *(*Array+i) = (int *)calloc( colsNumber, sizeof(int) );
        }
    }


    return 0;
} // allocatePointersArray()


Сравните с вашим вариантом.
8.9K
06 марта 2011 года
Apach47
130 / / 14.06.2010
Помоему ТС в функции надо принимать либо ссылку на указатель на указатель
 
Код:
int allocatePointersArray(int **&Array, int colsNumber, int rowsNumber);

либо в main передавать в функцию адрес, тогда
 
Код:
int allocatePointersArray(int **Array, int colsNumber, int rowsNumber);

в main
 
Код:
allocatePointersArray(&p, 10, 10);
278
06 марта 2011 года
Alexander92
1.1K / / 04.08.2008
Насколько я понял, ТС использует чистый C, а не C++, поэтому изначально и не предлагал вариант ссылки.

Цитата: Apach47
Помоему ТС в функции надо принимать либо ссылку на указатель на указатель
 
Код:
int allocatePointersArray(int **Array, int colsNumber, int rowsNumber);

 
Код:
allocatePointersArray(&p, 10, 10);



Эти две строки несовместимы, p сам по себе объявлен как int**, а вы пытаетесь передать int***.

66K
06 марта 2011 года
Sanka744
5 / / 28.02.2011
Так как исправить чтобы работало?
278
06 марта 2011 года
Alexander92
1.1K / / 04.08.2008
Вот так.
66K
20 марта 2011 года
Sanka744
5 / / 28.02.2011
Код:
int ** allocatePointersArray(int **Array, int colsNumber, int rowsNumber)
{
    int i = 0;
    int **ServiceVariable, **Result;

    // Allocating Memory for Rows in Pointers Array
    Result = (int **) calloc( rowsNumber, sizeof(int *) );
    if( !Result )
    {
        perror("Method allocatePointersArray. Can't allocate memory for ServiceVariable in Pointers Array\n");
        return Result;
    }

    // Trying to Allocate Solid Memory String for All Array Elements  / 1 /
    //                 or Separate Memory Stringsinstead              / 2 /
    if( !( ServiceVariable = (int **) calloc( colsNumber * rowsNumber, sizeof(int) ) ) )
    {
        // Allocate separate memory strings                           / 1 /
        free(ServiceVariable);
        for( i = 0; i < rowsNumber; ++i )
        {
            Result = (int *) calloc( colsNumber, sizeof(int) );
        }
        printf("Debug. Separate memory strings were allocated.\n");
    }
    else
    {
        // Allocate solid memory string                               / 2 /
        free(ServiceVariable);
        for( i = 0; i < rowsNumber; ++i )
        {
            Result = (int *) calloc( colsNumber, sizeof(int) );
        }
        printf("Debug. Solid memory string was allocated.\n");
    }

    return Result;
}

Вот этот код я считаю более правильным в данном контектсте.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог