2010-04-03 6 views
0

J'ai cette structure;C Problème de structure Problème

#define BUFSIZE 10 
struct shared_data { 
    pthread_mutex_t th_mutex_queue; 
    int count; 

    int data_buffer_allocation[BUFSIZE]; 
    int data_buffers[BUFSIZE][100]; 
}; 

et je veux affecter un des data_buffers pour un processus, à cette fin, j'exécute la fonction suivante;

int allocate_data_buffer(int pid) { 
    int i; 
    for (i = 0; i < BUFSIZE; i++) { 
     if (sdata_ptr->data_buffer_allocation[i] == NULL) { 
      sdata_ptr->data_buffer_allocation[i] = pid; 
      return i; 
     } 
    } 
    return -1; 
} 

mais le compilateur m'avertit que je compare le pointeur à une valeur. Quand je mets un & devant sdata_ptr ça se calme mais je ne suis pas sûr que ça marchera. Ce que j'ai écrit plus haut n'est-il pas censé être vrai?

+0

Pour que cela fonctionne comme prévu (après le correctif 'NULL'), gardez à l'esprit que vous devrez initialiser ces valeurs. – KevenK

Répondre

3

Probablement parce que NULL est # define'd pour être (void*)0 ce qui signifie

if (sdata_ptr->data_buffer_allocation[i] == NULL) { 

comparerions un int à un pointeur. Changez-le pour le comparer à 0 à la place.

+0

oh, oui, comment stupide: D merci – Halo

3

NULL est "null pointeur", mais data_buffer_allocation est un tableau de int. Vous devriez comparer à 0:

if (sdata_ptr->data_buffer_allocation[i] == 0) { 
0

Étant donné que vous ne disposez pas d'un tableau de pointeurs, les comparaisons à NULL sont incorrectes (bien qu'ils finissent par résoudre à 0).

Pour que la comparaison soit valide, vous devez comparer le répertoire à zéro. Cependant, gardez à l'esprit que l'acquisition de votre tableau n'initialise pas les valeurs, donc vous aurez des ordures aléatoires dans votre tableau pour commencer. Par conséquent, la comparaison à zéro (sauf si vous avez initialisé vos valeurs à zéro ailleurs) sera incohérente et inutile.

En outre, il peut être nitpicky, mais quand j'entends une méthode/fonction comme allocate_data_buffer je pense à l'acquisition de ressources, comme nécessitant un new ou new[]. Le nom de votre méthode et l'utilisation de NULL et autres semblent indiquer que ce code était initialement destiné à utiliser réellement des pointeurs pour cette allocation, mais a peut-être été modifié. Pour que la modification soit «complète» à mon avis, je continuerais en créant un nom d'initialisation et de méthode approprié.