2009-05-10 10 views
0

En C, dans un environnement Unix (Plan9), j'ai un tableau en tant que mémoire.Int dans un tableau de mémoire simulé de UCC

uchar mem[32*1024]; 

I besoin que matrice pour contenir différents domaines, tels qu'un int (entier) pour indiquer la taille de la mémoire libre et avaliable. Alors, je l'ai essayé ceci:

uchar* memp=mem; 
*memp=(int)250; //An example of size I want to assign. 

Je sais que la taille d'un int est de 4, donc je dois forcer la coulée ou quelque chose comme ça, que le contenu des quatre premières tranches de mem ont le nombre 250 dans ce cas, c'est gros endian.

Mais le problème est que lorsque j'essaie de faire ce que j'ai expliqué, cela ne fonctionne pas. Je suppose qu'il y a une erreur avec la conversion des types. J'espère vous demander, comment pourrais-je forcer que mem [0] à mem [3] aurait la taille indiquée, représentée comme un int et non comme un uchar?

Merci à l'avance

Répondre

2

Comme ceci:

*((int*) memp) = 250; 

qui dit: « Même si memp est un pointeur vers des personnages, je veux que vous le traiter comme un pointeur vers des entiers, et de mettre cet entier où il points."

+0

Ok, merci, ça marche. Et j'ai le point. –

+0

Mais, si je veux assigner un pointeur à une autre partie de mem (le tableau des caractères non signés), au début à zéro. Est-ce que je pourrais faire quelque chose comme ceci?: * ((void *) memp) = nil; Il ne compile pas. :( –

+0

Il est jamais possible de déréférencer un pointeur (void *). – ephemient

0

Diffusez le pointeur sur int, pas unsigned char à nouveau!

int * memp = (int *)mem; 
* memp = 250; //An example of size I want to assign. 
2

Avez-vous pensé à utiliser un syndicat, comme dans:

union mem_with_size { 
    int size; 
    uchar mem[32*1024]; 
}; 

Ensuite, vous n'avez pas à vous soucier de la coulée. (Vous devez toujours vous soucier de l'ordre des octets, bien sûr, mais c'est un problème différent.)

1

Comme d'autres l'ont souligné, vous devez lancer un pointeur vers int. Vous devez également vous assurer de prendre en compte l'alignement du pointeur: sur de nombreuses architectures, un int doit commencer à un emplacement mémoire divisible par sizeof (int), et si vous essayez d'accéder à un int non aligné, vous obtenez un SIGBUS. Sur d'autres architectures, cela fonctionne, mais lentement. Sur d'autres encore, cela fonctionne rapidement.

Une façon portable de faire cela pourrait être:

int x = 250; 
memcpy(mem + offset, &x, sizeof(x)); 

En utilisant les syndicats peuvent rendre cela plus facile, cependant, donc +1 à Jamieh.