2016-09-29 2 views
3

J'ai trouvé un moyen intéressant d'allouer des matrices en C qui permet l'utilisation de [i][j] sans initialiser comme double matrix_a[nrows][ncols]. L'allocation estType spécifique gratuit d'allocation de mémoire en C

double (*matrix_a)[ncols] = (double (*)[ncols])malloc(sizeof(double) * (nrows) * (ncols)); 

Mais je ne trouve pas comment libérer correctement ce type d'allocation. Serait-ce aussi simple que free(matrix_a)?

+0

Ce qui est unique dans cette répartition? Attribution typique + cast. –

+0

C'est unique dans le sens où je ne l'ai jamais vu auparavant. J'ai manqué de mémoire avec une allocation assez rapide avec 'double matrix_a [nrows] [ncols]' et j'ai trouvé ce style à la recherche de méthodes plus efficaces. – mjswartz

+0

Vous venez d'allouer de la mémoire sur le tas. 'double a [m] [n]' alloue sur la pile, et la pile est plus limitée que heap (typiquement). Il n'y a rien de spécial ici. –

Répondre

6

C'est correct. Vous pouvez seulement passer à free ce qui a été retourné de malloc et famille. Donc, puisque vous avez fait un malloc, vous faites un free.

Aussi, there is no need to cast the return value of malloc:

double (*matrix_a)[ncols] = malloc(sizeof(double) * (nrows) * (ncols)); 
+0

Si je supprime la conversion, j'obtiens 'error: conversion invalide de 'void *' en 'double (*) [ncols]' [-fpermissive]' – mjswartz

+1

@mjswartz C'est parce que vous compilez avec un compilateur C++, pas un C compilateur. C++ nécessite le cast. – dbush