Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

problème d’allocation




  1. #1
    pseudomehdi

    problème d’allocation

    salut, est ce que quelqu'un pourrai m'expliquer pourquoi j’obtiens un "acces violation" pour ce code et merci d'avance
    Code:
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <conio.h>
    #define NMAX 10
    typedef struct {
    
    	int age;
    
    }personne;
    
    int main()
    {
    	int i = 0;
    	personne** tab = NULL;
    	tab = (personne**)malloc(sizeof(personne*)*NMAX);
    	if (tab = NULL)
    		exit(EXIT_FAILURE);
    	for (i = 0; i < NMAX; i++)
    	{
    		tab[i] = (personne*)malloc(sizeof(personne));
    	}
    }

    -----


  2. Publicité
  3. #2
    Ikhar84

    Re : problème d’allocation

    Salut !

    Essaies avec:
    Code:
        if (tab == NULL)
            exit(EXIT_FAILURE);
    
        for (i = 0; i < NMAX-1; i++) {
            tab[i] = (personne*)malloc(sizeof(personne));
        }
    Et même, si i n'est plus utilisé ensuite:

    Code:
        if (tab == NULL)
            exit(EXIT_FAILURE);
    
        for (int i = 0; i < NMAX-1; i++) {
            tab[i] = (personne*)malloc(sizeof(personne));
        }
    Accessoirement, quel est le but d'un "tableau" de "tableau" de Personne, en projetant que la structure personne contiendra plus que un seul int ?
    Dernière modification par Ikhar84 ; 03/01/2019 à 00h38.
    J'ai glissé Chef !

  4. #3
    pm42

    Re : problème d’allocation

    Pour préciser la réponse ci-dessus, tu as mis un = dans ton test if à la place d'un ==. Grand classique mais normalement, les compilos modernes te préviennent.


  5. #4
    PA5CAL

    Re : problème d’allocation

    Bonsoir

    Citation Envoyé par pseudomehdi Voir le message
    Code:
    	if (tab = NULL)
    Cette ligne remet le pointeur tab à zéro.

    Pour tester une variable sans la modifier, il faut utiliser l'opérateur « == » (test d'égalité) et non pas « = » (assignation), soit :
    Code:
    	if (tab == NULL)

    [EDIT: grillé par pm42]
    Dernière modification par PA5CAL ; 03/01/2019 à 01h53.

  6. #5
    PA5CAL

    Re : problème d’allocation

    Citation Envoyé par pm42 Voir le message
    mais normalement, les compilos modernes te préviennent.
    En principe, les compilos modernes ne préviennent que si on le leur demande. Toutefois, l'activation de ce type d'option risque de produire une liste de messages de mise en garde pas nécessairement très parlants et susceptible d'alourdir l'analyse des erreurs, voire de finir par en occulter.

    Ici le problème ne provient pas d'une erreur d'utilisation du langage, mais de l'emploi d'un opérateur qui ne correspond pas à l'opération réellement souhaitée, certainement du fait d'un manque d'habitude dans le codage avec ce type de langage.

    On active rarement l'option pour détecter cette confusion, car il est en fait assez courant de réaliser l'assignation et le test en même temps, comme par exemple :
    Code:
    int *p;
    if( p=(int*)malloc(sizeof(int)*10) ) {
    
    ...
    
      free(p);
    } else
      erreur();

  7. A voir en vidéo sur Futura
  8. #6
    pseudomehdi

    Re : problème d’allocation

    merci les gars, @ikhar84 en fait c'était un programme plus grand mais j'ai commencé à supprimer des fonctions et des champs de structures pour essayer de localiser l'erreur, il s'agit d'un programme qui initialise NMAX fiches puis propose à l'utilisateur de choisir une fiche à modifier.
    Code:
    #include "pch.h"
    #include <iostream>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <conio.h>
    #define NMAX 2
    using namespace std;
    typedef struct {
    	char nom[30] , prenom[30], adresse[30], DateDeNaissance[30],  nationnalite[30],  metier[30], hobby[30];
    	int age;
    
    }personne;
    void init(personne*p1);
    void init(personne* p1)
    {
    	cout << "entrer un age" << endl;
    	cin >> p1->age;
    	rewind(stdin);
    	cout << "entrer un nom" << endl;
    	fgets(p1->nom, 100, stdin);
    	cout << "entrer un prenom" << endl;
    	fgets(p1->prenom, 100, stdin);
    	cout << "entrer une adresse" << endl;
    	fgets(p1->adresse, 100, stdin);
    	cout << "entrer une date de naissance" << endl;
    	fgets(p1->DateDeNaissance, 100, stdin);
    	cout << "entrer une nationnalite" << endl;
    	fgets(p1->nationnalite, 100, stdin);
    	cout << "entrer un metier" << endl;
    	fgets(p1->metier, 100, stdin);
    	cout << "entrer un hobby" << endl;
    	fgets(p1->hobby, 100, stdin);
    	rewind(stdin);
    	cout << endl;
    }
    void affiche(personne** c);
    void affiche(personne** c)
    {
    
    	char k[30];
    	int v = 0, n = 0;
    	cout << "entrer le nom d'une fiche" << endl;
    	cin >> k;
    	for (int i = 0; i < NMAX; i++)
    	{
    		v = strcmp(k, c[i]->nom);
    		if (v = 1)
    		{
    			n = i;
    		}
    	}
    	cout << "age :";
    	cout << c[n]->age << endl;
    	cout << "nom :";
    	cout << c[n]->nom << endl;
    	cout << "prenom :";
    	cout << c[n]->prenom << endl;
    	cout << "adress :";
    	cout << c[n]->adresse << endl;
    	cout << "date de naissance :";
    	cout << c[n]->DateDeNaissance << endl;
    	cout << "nationnalite :";
    	cout << c[n]->nationnalite << endl;
    	cout << "metier :";
    	cout << c[n]->metier << endl;
    	cout << "hobby :";
    	cout << c[n]->hobby;
    }
    int modif(personne** t);
    int modif(personne** t)
    {
    	char k[30];
    	int v;
    	cout << "entrer un nom pour la recherche" << endl;
    	cin >> k;
    	for (int i = 0; i < NMAX; i++)
    	{
    		v = strcmp(k, t[i]->nom);
    		if (v = 1)
    		{
    			return i;
    		}
    	}
    }
    int main()
    {
    	int u = 0;
    	personne** tab = NULL;
    	tab = (personne**)malloc(sizeof(personne*)*NMAX);
    	if (tab == NULL)
    		exit(EXIT_FAILURE);
    	for (int i = 0; i < NMAX; i++)
    	{
    		tab[i] = NULL;
    		tab[i] = (personne*)malloc(sizeof(personne));
    		if (tab[i] == NULL)
    			exit(EXIT_FAILURE);
    
    	}
    	for (int i = 0; i < NMAX; i++)
    		init(tab[i]);
    
    
    	u = modif(tab);
    	init(tab[u]);
    	affiche(tab);
    	for (int i = 0; i < NMAX; i++)
    		free(tab[i]);
    	free(tab);
    	return 0;
    }

  9. #7
    pm42

    Re : problème d’allocation

    Citation Envoyé par PA5CAL Voir le message
    En principe, les compilos modernes ne préviennent que si on le leur demande.
    Cela dépend vraiment du compilo. Exemple avec LLVM sans aucune option, sans rien demander :

    Code:
    foo.c:5:6: warning: using the result of an assignment as a condition without
          parentheses [-Wparentheses]
            if(p=NULL) {
               ~^~~~~
    foo.c:5:6: note: place parentheses around the assignment to silence this warning
            if(p=NULL) {
                ^
               (     )
    foo.c:5:6: note: use '==' to turn this assignment into an equality comparison
            if(p=NULL) {
    Mais pour d'autres, c'est plus compliqué en effet.

  10. Publicité
  11. #8
    Nobody91

    Re : problème d’allocation

    Une petite règle de codage qui peut être utilisée (mais que je n'aime pas en pratique car on perd en lisibilité et de plus les compilos modernes remontent un warning, est d'inverser le test ce qui donne une erreur d'affectation comme:
    if (NULL = p)

  12. #9
    PA5CAL

    Re : problème d’allocation

    Citation Envoyé par Nobody91 Voir le message
    Une petite règle de codage qui peut être utilisée (mais que je n'aime pas en pratique car on perd en lisibilité et de plus les compilos modernes remontent un warning, est d'inverser le test ce qui donne une erreur d'affectation comme:
    if (NULL = p)
    En ce qui me concerne, j'ai pris pour habitude de rendre cette pratique systématique, non pas pour détecter une éventuelle confusion entre == et = (bien que cela règle aussi ce problème), mais justement pour rendre le code plus lisible, en particulier lorsque les expressions testée dans le if sont longues. Cela permet de connaître d'emblée l'opération et la valeur des tests effectués sans devoir chercher la fin des expressions.

    Code:
    if (4 == (ma_fonction_a_rallonge(avec, plein(de, trucs)) + qui_prennent(de, la, place)/sur(la, ligne) - et(qui, compliquent)/la_relecture(du, code)) ) { ...

Discussions similaires

  1. [Programmation] Problème allocation mémoire PIC24E avec XC16
    Par SportsEngine dans le forum Électronique
    Réponses: 3
    Dernier message: 14/10/2017, 00h01
  2. [Analogique] Comment l’appareil sait t’il quel courant il peut prendre de l’USB?
    Par AmigaOS dans le forum Électronique
    Réponses: 12
    Dernier message: 01/10/2017, 15h54
  3. Que fait l’ordinateur lors d’envoi d’arguments à une fonction ?
    Par AmigaOS dans le forum Programmation et langages, Algorithmique
    Réponses: 58
    Dernier message: 19/09/2011, 10h49
  4. problème insertion fichier .txt dans une allocation dynamique
    Par Ptitsuisse91 dans le forum Programmation et langages, Algorithmique
    Réponses: 9
    Dernier message: 09/01/2011, 19h32
  5. Réponses: 46
    Dernier message: 12/05/2010, 09h46