2017-10-10 29 views
1

J'ai un tableau 2D simulé en utilisant des pointeurs avec malloc et je veux obtenir la taille de ce tableau, puisque sizeof() me renvoie la taille du pointeur. Mon code (ANSI C):Obtenir la taille d'un tableau simulé en utilisant malloc

void main(){ 
    int s1=10; 
    int s2=15; 
    int ** rack=(int**)malloc(s1*sizeof(int**)); 
    for(int i=0; i<s1; i++) rack[i]=(int*)malloc(s2*sizeof(int*)); 
} 

Je veux une fonction (peut par le système, peut le faire moi-même) de cette façon:

size(rack) //returns 10 
size(rack[0]) //returns 15 

Merci à l'avance! (Pour plus d'informations j'utilise GNU/Linux)

+2

Notez que [le pointeur sur le tableau de pointeurs n'est pas vraiment un tableau 2D] (https://stackoverflow.com/q/42094465/694733). De plus, ANSI C se réfère à une ancienne version obsolète de C; Si vous êtes sur Linux, il est tout à fait possible que vous puissiez passer à C11. – user694733

+3

Une bonne habitude est de ne pas faire 'sizeof' dans' malloc' avec le type mais avec l'objet que le pointeur est supposé pointer sur 'malloc (s1 * sizeof * rack)'. Aussi en C, vous ne devriez pas lancer le retour de 'malloc' et des amis. –

+1

Vous allouez la mauvaise quantité d'espace dans les mallocs –

Répondre

0

Tout d'abord, la façon dont vous allouez de la mémoire pour votre tableau 2D est fausse. Vous devez changer pour:

void main(){ 
    int s1 = 10; 
    int s2 = 15; 
    int** rack = malloc(s1*sizeof(int*)); 
    if (rack == NULL) 
     return; 
    for(int i=0; i<s1; i++) { 
     rack[i]=malloc(s2*sizeof(int)); 
     if (rack[i] == NULL) 
      return; 
    } 

    ... 

    free(rack); 
    return; 
} 

Rappelez-vous de toujours check malloc's result et aussi not to cast malloc's result.

Afin d'obtenir la taille de votre tableau, vous pouvez imprimer s1*s2*sizeof(int) que vous avez alloué s1 pointeurs à int, dont chacun détient s2int s.

+0

Veuillez noter que vous ne libérez pas toute la mémoire que vous avez allouée. –

+0

@Bob__ Je n'ai pas parce que je n'ai répondu qu'à la partie de l'allocation. J'ai supposé que l'OP a libéré sa mémoire mais nous a montré une partie minimale. – Marievi

+0

En raison de différences dans la plage de 'int' et' size_t', 's1 * s2 * sizeof (int)' peut déborder tandis que 'sizeof (int) * s1 * s2 *' ne le fait pas. IAC, mieux vaut utiliser 'size_t' pour l'indexation et la taille du tableau que pour' int'. – chux