Je suis nouveau à C. (J'utilise C89 sur Visual Studio 2010.) J'ai écrit un petit programme qui utilise un arbre pour donner un histogramme des arguments présentés au programme. Y a-t-il des erreurs évidentes de débutant que j'ai faites? Tout semble fonctionner correctement dans mes tests extrêmement limités.C89: Des erreurs débutant dans ce code?
hist.c
#include "tree.h"
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
unsigned int i;
struct tree *tree;
tree = NULL;
for (i = 1; i < argc; i++) {
tree = tree_add(tree, argv[i]); // adds strings to tree
}
tree_dump(tree); // prints results
tree_free(tree); // frees memory
getchar();
return 0;
}
tree.h
struct tree {
struct tree *left;
struct tree *right;
char *value;
unsigned count;
};
struct tree *tree_add(struct tree *tree, char *value);
struct tree *new_tree();
void tree_dump(struct tree *tree);
void tree_free(struct tree *tree);
tree_free.c
#include "tree.h"
#include <stdlib.h>
void tree_free(struct tree *tree) {
if (tree->left != NULL) {
tree_free(tree->left);
}
if (tree->right != NULL) {
tree_free(tree->right);
}
free(tree);
}
tree_dump.c
#include "tree.h"
#include <stdlib.h>
#include <stdio.h>
void tree_dump(struct tree *tree) {
if (tree != NULL) {
tree_dump(tree->left);
printf("%4u\t%s\n", tree->count, tree->value);
tree_dump(tree->right);
}
}
tree_add.c
#include "tree.h"
#include <stdlib.h>
#include <string.h>
struct tree *tree_add(struct tree *tree, char *value) {
if (tree == NULL) {
tree = new_tree();
tree->value = value;
tree->count = 1;
}
else if (strcmp(tree->value, value) == 0) {
tree->count++;
}
else if (strcmp(value, tree->value) < 0) {
tree->left = tree_add(tree->left, value);
}
else if (strcmp(value, tree->value) > 0) {
tree->right = tree_add(tree->right, value);
}
return tree;
}
struct tree *new_tree() {
struct tree * tree;
tree = malloc(sizeof *tree);
tree->left = NULL;
tree->right = NULL;
tree->value = NULL;
tree->count = 0;
return tree;
}
La plupart des systèmes d'exploitation, malloc n'échouera jamais, car le système d'exploitation overcommit. malloc vous renverra un peu d'espace d'adressage, mais pas de RAM. Lorsque vous le touchez, le système d'exploitation tentera d'allouer, et s'il ne le peut pas, il prendra une action drastique, vous envoyant éventuellement un SIGKILL par exemple. – smcameron
@smcameron: merci, je n'étais pas au courant de ça. Je passe le plus clair de mon temps à faire du développement embarqué - des plates-formes sans VM et souvent sans malloc (la fragmentation en tas est un vrai problème sur les systèmes qui fonctionnent 24/7 pendant des années sans redémarrer). – tomlogic
@smcameron Sur HP-UX, il est facile de limiter la quantité de mémoire qu'un tas peut recevoir. En conséquence, il est vraiment facile d'obtenir 0 à partir de 'malloc()'. –