2 votes

memset = plantage du programme

J'ai des difficultés avec memset. Si j'écris dans mon élément de tableau, mon programme se plante. Si je commente le memset, je n'ai aucun problème pour écrire

Mon type de structure :

typedef struct  
{
    char Frage  [maxLEN_F_A];
    char Antwort[maxLEN_F_A];
}Fragenfeld;

Ma déclaration de la structure :

Fragenfeld QuizFragen[maxFragen];
Fragenfeld *ptrQuizFragen = QuizFragen;

appel de mémorisation :

memset(&ptrQuizFragen,0,maxFragen*sizeof(Fragenfeld));

Ma fonction, où je modifie la valeur de l'adresse :

int Fragen_einlesen(Fragenfeld *Quizfragen)
{
....
strncpy(Quizfragen->Frage,sEingabe, maxLEN_F_A);
}

3voto

templatetypedef Points 129554

Quand vous écrivez

memset(&ptrQuizFragen,0,maxFragen*sizeof(Fragenfeld));

vous dites "s'il vous plaît, mettez beaucoup d'octets", à partir de l'adresse de la variable pointeur ptrQuizFragen à zéro." Notez que c'est différent de dire "s'il vous plaît, mettez beaucoup d'octets", en commençant au début du tableau pointé par ptrQuizFragen à zéro". Cela signifie que les octets sont écrits au mauvais endroit, ce qui est à l'origine de votre erreur.

Graphiquement, la configuration ressemble à quelque chose comme ceci :

ptrQuizFragen
+-----------+
|           |
+-----------+
      |
      v
+-----------+-----------+-----------+ ... +-----------+
|           |           |           |     |           |
+-----------+-----------+-----------+ ... +-----------+
QuizFragen

La ligne que vous avez écrite place les octets en commençant là où ptrQuizFragen est situé dans la mémoire, ce qui permet de faire cela :

ptrQuizFragen
+-----------+
| 00000000000000000000000000000000000 ... 000000000000 (oops!)
+-----------+

+-----------+-----------+-----------+ ... +-----------+
|           |           |           |     |           |
+-----------+-----------+-----------+ ... +-----------+
QuizFragen

La ligne que vous voulez est

memset(ptrQuizFragen, 0, maxFragen * sizeof(Fragenfeld));

qui dit de mettre les octets à l'emplacement mémoire indiqué par ptrQuizFragen . Ce serait le cas :

ptrQuizFragen
+-----------+
|           |
+-----------+
      |
      v
+-----------+-----------+-----------+ ... +-----------+
| 000000000 | 000000000 | 000000000 |     | 000000000 |
+-----------+-----------+-----------+ ... +-----------+
QuizFragen

3voto

John Bollinger Points 16563

Cette ...

memset(&ptrQuizFragen,0,maxFragen*sizeof(Fragenfeld));

... demande que la mémoire commençant à l'adresse de la variable ptrQuizFragen être écrite, mais ce que vous voulez, c'est que la mémoire à l'emplacement vers lequel pointe le pointeur soit écrite :

 memset(ptrQuizFragen, 0, maxFragen*sizeof(Fragenfeld));

Alternativement, pour la même raison que vous pouvez initialiser ptrQuizFragen comme vous le faites, vous pouvez aussi vous en passer complètement :

memset(QuizFragen, 0, maxFragen*sizeof(Fragenfeld));

De plus, il serait plus clair d'exprimer la taille souhaitée directement en fonction de l'objet sur lequel on écrit :

memset(QuizFragen, 0, sizeof(QuizFragen));

Cependant, s'il s'agit d'une initialisation ponctuelle, je n'utiliserais pas la fonction memset du tout :

Fragenfeld QuizFragen[maxFragen] = {0};

Bien que ce soit du C valide avec une sémantique bien définie, certains compilateurs peuvent avertir. Si le vôtre le fait, et que cela vous met mal à l'aise, alors une alternative serait d'étendre un peu à

Fragenfeld QuizFragen[maxFragen] = { { {0}, {0} } };

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X