Вопросы по языку СИ - страница 8

 
 
Igor Makanu:

да че там, есть области памяти а есть указатели на области памяти, хранящиеся в других областях памяти

и дальше по иерархии хоть до бесконечности, пока мозг способен воспринимать

 
Vladimir Simakov:
 Более того, ассемблерными вставками тоже очень даже пользуются.

частично забираю свои слова обратно, смотреть с 18:00 , да на асме не пишут, а правят уже скомпилированный код - тогда логично

насколько я понимаю, что делают современные компиляторы с ассемблерными вставками - это всего лишь имитация асм, т.е. не факт, что асм вставка именно в таком виде попадет в скомпилированный код, а чтобы действительно оптимизировать в асме код достаточно в дебагере переписать участки кода на асме - имхо


 
Maxim Dmitrievsky:

да че там, есть области памяти а есть указатели на области памяти, хранящиеся в других областях памяти

и дальше по иерархии хоть до бесконечности, пока мозг способен воспринимать

Ага, а еще классно получается не уследить за тем, жива ссылка или нет и залезть в давно освобожденный участок памяти, который уже другой процесс использует и все там поломать)))

 
Vladimir Simakov:

Ага, а еще классно получается не уследить за тем, жива ссылка или нет и залезть в давно освобожденный участок памяти, который уже другой процесс использует и все там поломать)))

Что за сказки, такое было возможно только в Windows 3.*. Винда вас в память чужого процесса не пустит, каждый процесс работает в своей области, причем для него адресация памяти начинается с нуля, винда ему так ее представляет. И вообще, винда память выделяет только при реальной записи данных. Сделайте массив double arr[1024*1024*1024] и посмотрите, сколько памяти выделилось реально в диспетчере задач. А нисколько! Пока в массив реально писать не начнете, память не будет выделяться кусочками по 4 Кб. Даже если будете писать по рандомным индексам, все равно такими кусочками. Как винда все это виртуализирует, для меня непостижимо!

 
Alexey Volchanskiy:

Как винда все это виртуализирует, для меня непостижимо!

неохота гуглить, но с появлением Пентиум-1 и появились у процессора дескрипторы сегментов памяти и виртуальная память, т.е. скорее всего это на уровне железа виртуализация, а Винда этим умело пользуется 

 
Alexey Volchanskiy:

Что за сказки, такое было возможно только в Windows 3.*. Винда вас в память чужого процесса не пустит, каждый процесс работает в своей области, причем для него адресация памяти начинается с нуля, винда ему так ее представляет. И вообще, винда память выделяет только при реальной записи данных. Сделайте массив double arr[1024*1024*1024] и посмотрите, сколько памяти выделилось реально в диспетчере задач. А нисколько! Пока в массив реально писать не начнете, память не будет выделяться кусочками по 4 Кб. Даже если будете писать по рандомным индексам, все равно такими кусочками. Как винда все это виртуализирует, для меня непостижимо!

Page Fault же. Исключение бдыщ - дали памяти на страницу, и не более. Это удобно и прозрачо для приложений, но приводит к фрагметации памяти. Можно выделить физическую память одним махом, если после virtualalloc вызвать virtuallock на полученный указатель. Кстати, интересная дырка, надо посмотреть, можно ли так завалить сервер.


В трёшке виртуализации не было, это другая система, не NT. Там вообще хвостов от доса было навалом, половина системных функций была навешана на int 21.

 

Не понятен такой случай:

/*
 * The mine_score structure describes the maximum normalized mutual information
 * scores (i.e. the characteristic matrix if est=EST_MIC_APPROX, the
 * equicharacteristic matrix instead). M[i][j] contains the score using a grid
 * partitioning x-values into i+2 bins and y-values into j+2 bins. m and M are
 * of length n and each M[i] is of length m[i].
 */
typedef struct mine_score
{
  int n;      /* number of rows of M */
  int *m;     /* number of cols of M[i] for each i */
  double **M; /* the (equi)characteristic matrix */
} mine_score;

Далее, в ф-ии идет изменение размера матрицы М:

/*
* Returns an initialized mine_score structure. Returns NULL if an error
* occurs.
*/
mine_score *init_score(mine_problem *prob, mine_parameter *param) {   int i, j;   double B;   mine_score *score;   if ((param->alpha > 0.0) && (param->alpha <= 1.0))     B = MAX(pow(prob->n, param->alpha), 4);   else if (param->alpha >= 4)     B = MIN(param->alpha, prob->n);   else     goto error_score;   score = (mine_score *) malloc (sizeof(mine_score));   if (score == NULL)     goto error_score;   score->n = MAX((int) floor(B/2.0), 2) - 1; задали кол-во строк, ок   score->m = (int *) malloc(score->n * sizeof(int)); а кол-во столбцов тут чему равно? кол-ву строк?   if (score->m == NULL)     goto error_score_m;   for (i=0; i<score->n; i++)     score->m[i] = (int) floor((double) B / (double) (i+2)) - 1;   score->M = (double **) malloc (score->n * sizeof(double *));   if (score->M == NULL)     goto error_score_M;   for (i=0; i<score->n; i++)     {       score->M[i] = (double *) malloc ((score->m[i]) * sizeof(double)); а здесь идет просто выделение памяти для матриы М?       if (score->M[i] == NULL)         {           for (j=0; j<i; j++)             free(score->M[j]);           goto error_score_M_i;         }     }   return score;   error_score_M_i:     free(score->M);   error_score_M:     free(score->m);   error_score_m:     free(score);   error_score:     return NULL; }

То есть, как я понял, вся эта портянка только для выделения памяти под матрицу, но никакими значениями она не заполняется? То есть этот код можно выкинуть для mql (ну, после определения кол-во строк, и такого же кол-ва столбцов квадратной матрицы)

или все-таки матрица инициализируется какими-то значениями

 
Alexey Volchanskiy:

...Как винда все это виртуализирует, для меня непостижимо!

Почитайте Рихтера. У него все это разжевано до боли в сердце.

SeriousRacoon:
  Кстати, интересная дырка, надо посмотреть, можно ли так завалить сервер

Нельзя.

 
Maxim Dmitrievsky:

Не понятен такой случай:

typedef struct mine_score
{
  int n;      /* number of rows of M */
  int *m;     /* number of cols of M[i] for each i */
  double **M; /* the (equi)characteristic matrix */
} mine_score;
  score->n = MAX((int) floor(B/2.0), 2) - 1; задали кол-во строк, ок
  score->m = (int *) malloc(score->n * sizeof(int)); а кол-во столбцов тут чему равно? кол-ву строк?
score->M[i] = (double *) malloc ((score->m[i]) * sizeof(double)); а здесь идет просто выделение памяти для матриы М?

Далее, в ф-ии идет изменение размера матрицы М:

То есть, как я понял, вся эта портянка только для выделения памяти под матрицу, но никакими значениями она не заполняется? То есть этот код можно выкинуть для mql (ну, после определения кол-во строк, и такого же кол-ва столбцов квадратной матрицы)

или все-таки матрица инициализируется какими-то значениями

В mine_score *m - УКАЗАТЕЛЬ на int, и в коменте сказано что это массив, то есть для каждой строки разное количество столбцов, это называется "гребневый масив" не прямоугольный.

score->m = (int *) malloc(score->n * sizeof(int))

Тут просто для этого массива длин строк выделяется память, значений нет

Для самой матрицы М 

score->M = (double **) malloc (score->n * sizeof(double *));

тут выделяется память для указателей строк

score->M[i] = (double *) malloc ((score->m[i]) * sizeof(double)); а здесь идет просто выделение памяти для матриы М?

а тут для столбцов

Причина обращения: