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

Ваш аккаунт

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

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

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

пРОСТОЙ вОПРОС?!

6.3K
27 января 2004 года
babulya
4 / / 27.01.2004
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]);

}

почему не хочет работать(компилиться) :) ? как правильно написать эту идею, чтобы отвести места указателю в куче и работать с данными как с матрицей (миссив двоичный) ?
6.3K
27 января 2004 года
babulya
4 / / 27.01.2004
я понимаю, можно работать с матрицей как p+=x+y;*p=1; blabla

но именно вот через [x][y] ?
5.6K
27 января 2004 года
[.MiR@Ge]
6 / / 13.01.2004
Цитата:
Originally posted by babulya
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);

2.6K
27 января 2004 года
Hearse
89 / / 19.01.2004
Разыменовать указатель int* с помощью [][] не получится по определению.
Правильно примерно так:
Код:
int **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);
3
27 января 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by [.MiR@Ge]

Тут прочитал на форуме 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];

Если на этапе выполнения:

Код:
#include <vector>

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;
6.3K
27 января 2004 года
babulya
4 / / 27.01.2004
Спасибо всем большое! Особенно Hearse и Green :)
6.1K
28 января 2004 года
PeterV
13 / / 28.01.2004
Цитата:
Originally posted by babulya
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.

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