#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()
Выделение памяти для массива указателей
Доброго времени суток, столкнулся тут с проблемкой - не получается выделить память под массив указателей. В функции - в main() все ок, а вот если оператор в функции - прога вылетает с ошибкой =(
Цитата: 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) );
}
}
{
// 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? Если не ошибаюсь, там абсолютно одинаковый код прописан.
На какой строке ошибка вылетает?
Код:
// Allocating Memory for Rows in Pointers Array
Array = calloc( rowsNumber, sizeof(int *) );
Array = calloc( rowsNumber, sizeof(int *) );
Эта же строка в main() уже работает ( раскомментированная, а соответствующий код в функции естественно закомментированный )
Код:
//p = calloc( rowsNumber, sizeof(int *) ); // вот здесь работает
Код:
#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()
#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()
Сравните с вашим вариантом.
Код:
int allocatePointersArray(int **&Array, int colsNumber, int rowsNumber);
либо в main передавать в функцию адрес, тогда
Код:
int allocatePointersArray(int **Array, int colsNumber, int rowsNumber);
в main
Код:
allocatePointersArray(&p, 10, 10);
Цитата: Apach47
Помоему ТС в функции надо принимать либо ссылку на указатель на указатель
Код:
int allocatePointersArray(int **Array, int colsNumber, int rowsNumber);
Код:
allocatePointersArray(&p, 10, 10);
Эти две строки несовместимы, p сам по себе объявлен как int**, а вы пытаетесь передать int***.
Так как исправить чтобы работало?
так.
Вот
Код:
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;
}
{
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;
}
Вот этот код я считаю более правильным в данном контектсте.