2010-10-01 5 views
0

Lorsque je débogue le code suivant, strncpy fonctionne bien mais dès que la boucle se termine, je vois que parent_var_names pointe NULL/0xfdfdfddf. Je suis perplexe!comportement étrange **/calloc

parent_var_names = (const char**)calloc(net->nodes[x]->num_parents, sizeof(const char*)); 
for(int i(1); i < net->nodes[x]->num_parents; ++i) 
{ 
    parent_var_names[i] = (const char*)malloc(strlen(rhs_arr[net->nodes[x]->markov_parents[i]])); 
    strncpy((char*)parent_var_names[i], (char*)rhs_arr[net->nodes[x]->markov_parents[i]], strlen(rhs_arr[net->nodes[x]->markov_parents[i]])); 
} 
+6

C ou C++? Choisissez-en un. Et il vaut mieux ne pas être C++. – GManNickG

+0

bien oui. c'est un compilateur C++. – jmgunn87

+1

Etes-vous sûr que toutes vos chaînes rhs_arr [net-> nodes [x] -> markov_parents [i]] sont fermées à zéro? vos chaînes parent_var_names ne le seront pas. – MerickOWA

Répondre

3

int i(1) dans votre init boucle for devrait probablement int i(0).

Sinon, vous ne définissez jamais parent_var_names[0] sur autre chose que le 0 que calloc() initialise à. Par souci d'exhaustivité (puisque cela est mentionné plusieurs fois dans les commentaires), vous ne tenez pas compte du terminateur '\ 0' pour les chaînes que vous copiez. Puisque vous ne copiez pas le terminateur dans vos appels strncpy(), vous ne débordez pas les tampons alloués, mais vos résultats ne sont pas correctement terminés. Il est possible que ce soit votre intention, mais ce serait inhabituel. Si cela est prévu, ajoutez un commentaire ...

1

Si vos parent_var_names ne sont pas terminés par NULL, c'est probablement parce que vous utilisez strlen lorsque vous allouez de l'espace pour les chaînes. Cela ne permet pas de créer de l'espace pour la chaîne et le terminateur NULL. Essayez plutôt strlen()+1.

Vous devriez probablement utiliser std :: string quand même ...

+0

ok, j'ai pris une pause et j'ai regardé à nouveau avec des yeux frais. l'int i (1) était l'erreur évidente. J'ai copié et collé plus haut le fichier pour cette boucle (maintenant je sais pourquoi c'est un non-non!). Parfois, quand vous regardiez l'écran pendant des heures, vous ne pouvez pas voir ce qui est clairement évident de vous regarder en face. acclamations de toute façon tous. – jmgunn87

+0

comment puis-je évaluer les gens ici? – jmgunn87

+0

oh et blastfurnace .. sur le PM vous m'avez envoyé .. je prends des erreurs ne sont jamais faites par vous? Je suppose que vous ne travaillez probablement pas assez fort pour que cela vous arrive. apprendre un peu d'humilité. Si je ne savais pas les tableaux dans la plupart des langages de programmation sont indexés 0, je ne pense pas que je serais beaucoup fait et croyez-moi je le fais. – jmgunn87

3

octets de garde Mise en place (à savoir 0xFDFDFDFD) autour d'une région de mémoire allouée est une caractéristique du tas de débogage (Microsoft). Voyant que vous rencontrez cette valeur, cela signifie soit que vous écrasez la mémoire quelque part, soit que vous regardez la valeur de parent_var_names[0] sans rien y écrire (par exemple, regardez de près la valeur que vous initialisez avec votre variable de boucle i).

En outre, votre code pourrait être simplifié à:

#include <string> 
/* ... */ 

int ii = 0; 
int parent_count = net->nodes[x]->num_parents; 
char** parent_var_names = calloc(parent_count, sizeof(char*)); 

for(; ii < parent_count; ++ii) 
{ 
    parent_var_names[ii] = strdup(rhs_arr[net->nodes[x]->markov_parents[ii]]); 
} 

Assurez-vous également que vos markov_parents sont certainement mis fin à zéro. Btw., En réponse à votre commentaire que vous voulez "compatibilité C et C++": Votre code n'est pas valide code C, donc ...