2016-12-01 2 views
0

Таким образом, у меня есть матрица, которая была создана таким образом:Как я освобождаю определенные строки и столбцы матрицы

int **mat(int nl, int nc) { 
    int i; 
    int **v = malloc(nl * sizeof(int *)); 

    for (i = 0; i < nl; i++) { 
    v[i] = calloc(nc, sizeof(int)); 
    } 
    return v; 
} 

Скажем, после ввода, это:

0 1 2 3 4 5 
1 2 3 4 5 6 
2 3 4 5 6 7 

Я бы хотите сохранить только первые 2 строки и первые 3 столбца и освободить память других строк и столбцов, чтобы он выглядел так:

0 1 2 
1 2 3 

Как это сделать?

+2

В коде отсутствует матрица (ака 2D-массив). 'int **' не является двумерным массивом, не может указывать на один или представлять его. Почему вы хотите освободить память? Просто не используйте все пространство. С частичным освобождением почти ничего не получается, вы просто взламываете пространство памяти. – Olaf

+0

Я вижу вашу мысль. Но если у вас есть большие строки, такие как 10000 элементов и размер, скажем, 4000 элементов, это может быть интересно, потому что у вас будет место для другой «матрицы», такой как это, и не будет никакой копии памяти в процессе «realloc». Память фрагментирована, но также и матрицы. Это зависит от разницы размеров строк до/после изменения размера. –

ответ

2

вам придется:

  • свободных полных строк после 2 первых (и установить nl на 2):

так:

for (i = 2; i < nl; i++) { 
    free(v[i]); 
    } 
nl = 2; 
  • выполните realloc из оставшихся строк (также установите nc на 3)
  • проверка realloc код возврата. В маловероятном случае было бы вернуть NULL, Откат к поддержанию вашего старого массива (reference)

так:

nc = 3; 
    for (i = 0; i < nl; i++) { 
    int *new_v = realloc(v[i], nc*sizeof(int)); 
    if (new_v!=NULL) 
    { 
     v[i] = new_v; 
    } 
    } 

Edit: если вы не меняли nc и печатать «старые» значения , казалось бы, ничего не сделал, потому что старые значения могут быть все еще там (освобождение делает не означает сброс памяти), но теперь вы можете получить доступ к нераспределенным данным: выполнение другого распределения может повторно использовать освобожденные данные и перезаписать их.

+0

Я сделал именно это, и, пытаясь распечатать матрицу, они все равно не освобождались. Единственное, что произошло, это первые 2 элемента в третьих строках, теперь 0, поэтому я думаю, это единственное, что освободилось. все то же самое – Andrei

+1

Время, чтобы посмотреть на свою процедуру печати немного более тщательно. Возможно, это чтение с конца массивов и причинение хаоса. –

+0

@ Andrei: даже нераспределенные данные остаются там до тех пор, пока другое распределение не уничтожит их. –

Смежные вопросы