Jak poprawnie zaalokować tablicę dwuwymiarową?

0

Witam, chciałbym się spytać czy poniższy kod w sposób poprawny alokuje tablicę "nieciągłą" i czy po stworzeniu tej tablicy nie wykorzystuje niepotrzebnych, dodatkowych bloków (komórek) w pamięci. Proszę o przeanalizowanie tego krótkiego kodu i rady dot. kodu, jak go zoptymalizować itd.

#include <stdio.h> 

void alokuj();

int main() {
	
	
	int komorki=5;
	
	alokuj(komorki);
		
	return 0;
	
}

void alokuj(int komorki) {
	
int **matrix=(int**)malloc(komorki * sizeof(int*));

for(int i=0;i<komorki;i++) {
	
	matrix[i]=(int*)malloc((komorki - i) * sizeof(int));
	
}
	for(int j=0;j<komorki;j++) {
		for(int k=0;k<komorki-j;k++){
			matrix[j][k]=2;
			
		}
	}


	for(int j=0;j<komorki;j++) {
		for(int k=0;k<komorki-j;k++){
			printf("%d",matrix[j][k]);
			
		}
		printf("\n");
	}

}
0

Wygląda na to, że jest OK, ale dla malloc powinieneś włączyć stdlib.h. No i potem pamiętać o dealokacji miejsca podobną metodą jak alokacja, tyle że w odwrotnej kolejności. Wypisywać możesz w tej samej pętli co przypisanie do każdego elementu.

1

@corey94 jako, że mam dobry dzień a czasem muszę coś robić w C, bo nie chcę zapomnieć jego składni:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
	int **get;
	size_t cols;
} trm;

trm trm_get(size_t cols) {
	trm ret = { malloc(cols * sizeof(int*)) , cols };
	size_t i;
	for(i = 0; i < cols; ++i)
		ret.get[i] = malloc((cols - i) * sizeof(int));
	return ret;
}

void trm_print(trm t) {
	size_t i,j;
	for(i = 0; i < t.cols; ++i) {
		for(j = 0; j < t.cols - i; ++j)
			printf("%d",t.get[i][j]);
		printf("\n");
	}
}

void trm_fill(trm *t, int n) {
	size_t i,j;
	for(i = 0; i < t->cols; ++i) {
		for(j = 0; j < t->cols - i; ++j)
			t->get[i][j] = n;
	}
}

void trm_free(trm *t) {
	while(t->cols--)
		free(t->get[t->cols]);
	free(t->get);
}

int main(void) {
	trm t = trm_get(5);
	trm_fill(&t,2);
	trm_print(t);
	trm_free(&t);
	return 0;
}

naucz się dzielić program na małe funkcje, które dobrze wykonują jedno zadanie. void alokuj() sugeruje, że zaalokuje pamięć a tymczasem zajmuje się również wypełnianiem oraz wypisywaniem tych danych. do tego jak będziesz chciał zwolnić pamięć też będziesz musiał dopisać to do tej funkcji alokuj(). najlepiej żeby allokuj zwracało wskaźnik i potem na tym wskaźniku z maina wywołuj odpowiednie funkcje, które będą operować na tych danych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1