2010-02-12 6 views
1

J'ai le problème suivant:Comment déterminer la longueur totale des caractères d'un tableau de pointeurs char?

J'ai un tableau de pointeurs ombles

char *opts[] = { "-a", "--append", "-b" }; 

et un nom de commande stocké dans

char cmd[] = "ls"; 

Maintenant, je dois calculer toutes les combinaisons possibles, que je avez fait en utilisant la bibliothèque scientifique GNU et exécutez la commande avec les combinaisons de calcul.

Le problème que j'ai est de savoir comment calculer la quantité de mémoire que j'ai besoin pour le char * se passer à un système().

Voici mon premier essai:

int length = strlen(cmd) * sizeof(char); 

for (int i = 0; i < 3; ++i) { 
    length += strlen(opts[i]) * sizeof(char); 
} 

Eh bien, cela a fonctionné, mais je sens que ce n'est pas le droit/meilleure solution. Puis-je pas jeté les deux dimensions-tableau à une dimension à réseau plat et obtenir la taille de celui-ci (si je ne me trompe pas, le sont pas des tableaux multidimensionnels en C, C les imite seulement).

+0

puisque tout est en fin de compte mis en correspondance avec une unidimensionnelle espace mémoire, aucune langue n'a vraiment des tableaux multidimensionnels ... – fortran

Répondre

2

Je ne peux pas jeter les deux dimensions-tableau à une seule dimension-gamme

plat Techniquement pas vrai, mais hors de propos ici, comme vous n'avez pas deux tableau multidimensionnel. Vous avez un tableau à une dimension de valeurs qui ont une longueur. Il n'y a aucune garantie que ces chaînes sont dans la mémoire contiguë, donc il serait impossible de mesurer leur taille totale en une seule étape.

La façon de le faire est la seule façon d'obtenir e Evalue que vous voulez.

P.S. Notez que sizeof(char) est garanti à l'égalité 1.

PPS Bien que je l'ai déjà marqué vers le bas la réponse de tommie75, on peut mettre une partie à utiliser:

int numelem = sizeof(opts)/sizeof(opts[0]); 
for (int i = 0; i < numelum; ++i) 
{ 
    length += strlen(opts[i]) * sizeof(char); 
} 
+0

James: Merci! :) Voir ma réponse sous la direction qui a un titre trompeur de la question ... – t0mm13b

+0

BTW, je ne garantiraient pas qu'un sizeof (char) est égale à 1, soit - c'est implmentation défini par conséquent, sur certains systèmes, il pourrait être 2 ... http: //stackoverflow.com/questions/2252033/in-c-why-is-sizeofchar-1-when-a-is-an-int – t0mm13b

+1

@ tommieb75: La norme C dit: ' lorsque [sizeof est] appliqué à un opérande qui est de type char, unsigned char ou char signé, (ou une version qualifiée de celui-ci), le résultat est 1.' donc sizeof ((un)? signé)? char * est * garanti à 1, dans la norme C. –

Questions connexes