Путаница в `memset` 2D-массива и ошибка в` free` - PullRequest
0 голосов
/ 05 июня 2018

Я использую malloc для динамического выделения памяти, используйте memset для инициализации 2D-массива и используйте free для освобождения памяти.Код:

int n1=2,n2=5;
int in1;
float **a;
a = (float **)malloc(n1*sizeof(float *));
for (in1=0;in1<n1;in1++)
    a[in1] = (float *)malloc(n2*sizeof(float));
memset(a[0],0,n1*n2*sizeof(float));
free(*a);free(a);

Первая проблема при запуске кода: * Ошибка в `./try1 ': free (): неверный следующий размер (быстрый): 0x0000000000c06030 *

Второй вопрос: поскольку для использования memset необходимо наличие смежной памяти.Вот почему он не работает с трехмерным массивом (см. Ошибка в memset () трехмерного массива ).Но здесь a - это двумерный указатель или массив, входные данные memset равны a[0].Насколько я понимаю:

  +---------+---------+-----+--------------+
  | a[0][0] | a[0][1] | ... | a[0][n2 - 1] |
  +---------+---------+-----+--------------+
    ^
    |
 +------+------+-----+-----------+
 | a[0] | a[1] | ... | a[n1 - 1] |
 +------+------+-----+-----------+
           |
           v
         +---------+---------+-----+--------------+
         | a[1][0] | a[1][1] | ... | a[1][n2 - 1] |
         +---------+---------+-----+--------------+

На рисунке выше показана непрерывная память.Таким образом, memset(a[0],0,n1*n2*sizeof(float)); может успешно инициализировать **a.Я прав?Если это не смежно, как инициализация может быть успешной?(из протестированного открытого исходного кода)

1 Ответ

0 голосов
/ 05 июня 2018

На приведенном выше рисунке показана непрерывная память.

Нет, это не так.Он показывает две области непрерывной памяти: a [0] [0] -> a [0] [n2 - 1] и a [1] [0] -> a [1] [n2 - 1].

Вы можете попытаться инициализировать и стереть каждый из них:

int n1 = 2, n2 = 5;
int in1;
float **a;
a = (float **)malloc(n1*sizeof(float *));
for (in1 = 0; in1<n1; in1++)
{ 
    a[in1] = (float *)malloc(n2*sizeof(float));
    memset(a[in1], 0, n2*sizeof(float));
}
for (in1 = 0; in1<n1; in1++)
{
    free(*(a+in1));
}
free(a);

Только в случае «реального» 2-мерного массива, такого как float a[2][5];, ваше предположение о непрерывной памяти верное.

...