пРОСТОЙ вОПРОС?!
int *a;
a=(int *)malloc(3*3);
a[0][0]=1;
a[0][1]=2;
a[1][0]=3;
a[1][1]=4;
printf("%d %d %d %d\n",a[0][0],a[0][1],a[1][0],a[1][1]);
}
почему не хочет работать(компилиться) :) ? как правильно написать эту идею, чтобы отвести места указателю в куче и работать с данными как с матрицей (миссив двоичный) ?
но именно вот через [x][y] ?
main() {
int *a;
a=(int *)malloc(3*3);
a[0][0]=1;
a[0][1]=2;
a[1][0]=3;
a[1][1]=4;
printf("%d %d %d %d\n",a[0][0],a[0][1],a[1][0],a[1][1]);
}
почему не хочет работать(компилиться) :) ? как правильно написать эту идею, чтобы отвести места указателю в куче и работать с данными как с матрицей (миссив двоичный) ?
Во-первых, выделяется недостаточно памяти. По умолчанию в C++ все числа приводятся к типу int (на сколько я помню), который в памяти занимает 4 байта. Т.о. для массива из 4 чисел нужно 16 байт, а выделяется 3*3=9 байт.
Тут прочитал на форуме ClubPro про указатели и массивы и понял что C++ до сих пор не знаю совсем :-) Можно обойтись без массива, а обращаться к динамической памяти через указатель:
int a0 = *(int *)((DWORD)a + 0);// + 0 для наглядности
int a1 = *(int *)((DWORD)a + 4);
int a2 = *(int *)((DWORD)a + 8 );
int a3 = *(int *)((DWORD)a + 12);
Да и в конце нужно сделать free(a);
Правильно примерно так:
int n,m;
int i;
n=3;
m=2;
a=(int**)malloc(n*sizeof(int));
for (i=0;i<n;i++)
a=(int*)malloc(m*sizeof(int));
...
for (i=0;i<n;i++)
free(a);
free(a);
Тут прочитал на форуме ClubPro про указатели и массивы и понял что C++ до сих пор не знаю совсем :-) Можно обойтись без массива, а обращаться к динамической памяти через указатель:
int a0 = *(int *)((DWORD)a + 0);// + 0 для наглядности
int a1 = *(int *)((DWORD)a + 4);
int a2 = *(int *)((DWORD)a + 8 );
int a3 = *(int *)((DWORD)a + 12);
Да и в конце нужно сделать free(a);
Ты считаешь, что это C++?
Это С, а не С++.
Приведенный код небезопасен, плохо читабелен и трудно модифицируем. Для сравнения, другой вариант написания приведенного примера:
int a[SIZE];
int a0 = a[0];
int a1 = a[1];
int a3 = a[3];
Нагляднее?
По поводу вопроса топика. Тебе нужен массив, размер которого определен на этапе компиляции, или размер определяется в ходе выполнения программы?
Если на этапе компиляции:
int a[SIZE_X][SIZE_Y];
Если на этапе выполнения:
typedef std::vector< std::vector<int> > TArray;
TArray array;
.......................
// определяем размеры массива
array.resize(size_X);
for(TArray::iterator it=array.begin(); it!=array.end(); (it++)->resize(size_Y) );
// пример обращения к элементу массива
array[2][3] = 5;
main() {
int *a;
a=(int *)malloc(3*3);
a[0][0]=1;
a[0][1]=2;
a[1][0]=3;
a[1][1]=4;
printf("%d %d %d %d\n",a[0][0],a[0][1],a[1][0],a[1][1]);
}
почему не хочет работать(компилиться) :) ? как правильно написать эту идею, чтобы отвести места указателю в куче и работать с данными как с матрицей (миссив двоичный) ?
main() {
int *a;
a=(int *)malloc(4*4);
*a=1;
*(a+1)=2;
*(a+2)=3;
*(a+3)=4;
printf("%d %d %d %d\n",*a,*(a+1),*(a+2),*(a+3));
free(a);
}
Теоретически это уже должно компилироваться.
Думаю, если a был бы типа a[][], тогда код компилировался бы, но без malloc.