CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C] Malloc pointeur ou pas pointeur ?

shmemory
shmemory
Niveau 8
17 novembre 2016 à 20:57:06

Salut,

Petite question un morceau de code :

#include <stdio.h>
#include <stdlib.h>

typedef struct s_boule{
	int rayon ;
	int chat ;
	int truc;	
} Boule ;


int main(void){

	Boule **lesboules;
	Boule a = { .rayon=95, .chat=66, .truc=987 } ;

	lesboules = malloc( 3 * sizeof(Boule));
	
	lesboules[0] = &a ;
	lesboules[1] = &a ;
	lesboules[2] = &a ;

	printf("boule : %d, boule* : %d", sizeof(Boule), sizeof(Boule*));	
	printf("rayon a : %d\n", a.rayon);

	printf("rayon [1] : %d", lesboules[0]->rayon);
	printf("rayon [2] : %d", lesboules[1]->rayon);
	printf("rayon [3] : %d", lesboules[2]->rayon);


return 0;
}

J'hésite si pour le malloc je dois mettre un sizeof(Boule) ou sizeof(Boule*). Ici ma variables lesboules est bien un tableau de pointeurs, ce qui voudrait dire qu'il faut mettre sizeof(Boule*). Mais ça fonctionne avec les deux sizeof(Boule) et sizeof(Boule*) alors qu'ils ont une taille différente (8 pour le pointeur contre 12 pour le "non pointeur") .. pourquoi ? pourquoi ça fonctionne dans les deux cas ?

IssouAlChancla
IssouAlChancla
Niveau 9
17 novembre 2016 à 21:01:45

Tu met sizeof *lesboules ça marche tout le temps et ça t'évite des erreurs comme ça

shmemory
shmemory
Niveau 8
17 novembre 2016 à 21:02:10

Ah ok je pense avoir pigé, en fait il faut mettre Boule* puisque c'est un tableau de pointeur. Et comme sizeof(Boule) est plus grand que sizeof(Boule*) ça fonctionne aussi, mais le tableau alloué sera trop grand et un morceau de l'espace ne sera pas utilisé

c'est ça hein ? [[sticker:p/1lmh]]

IssouAlChancla
IssouAlChancla
Niveau 9
17 novembre 2016 à 21:06:13

Le 17 novembre 2016 à 21:02:10 shmemory a écrit :
Ah ok je pense avoir pigé, en fait il faut mettre Boule* puisque c'est un tableau de pointeur. Et comme sizeof(Boule) est plus grand que sizeof(Boule*) ça fonctionne aussi, mais le tableau alloué sera trop grand et un morceau de l'espace ne sera pas utilisé

c'est ça hein ? [[sticker:p/1lmh]]

Oui, mais de toutes façon le C fait aucune vérification sur les zones mémoires que tu utilise, donc même si t'avais fait l'erreur t'aurais pu ne pas t'en rendre compte (jusqu'à ce que ton programme tente d'écrire dans une zone réservée à un autre programme, dans ce cas ton programme est stopé)

shmemory
shmemory
Niveau 8
17 novembre 2016 à 21:13:46

Ah ouai :bave:

Du coup ici l'exemple inverse :

#include <stdio.h>
#include <stdlib.h>

typedef struct s_boule{
    int a,b,c,d,cafe;
} Boule ;

int main(void){

    Boule *lesboules;
    Boule a = { .cafe=66 } ;
    lesboules = malloc( 3 * sizeof(Boule*));
    lesboules[0] = a ;
    lesboules[1] = a ;
    lesboules[2] = a ;
    printf("boule : %d, boule* : %d et %d", sizeof(Boule), sizeof(Boule*), sizeof(*lesboules));
    printf("rayon a : %d\n", a.cafe);

    printf("rayon [1] : %d", lesboules[0].cafe);
    printf("rayon [2] : %d", lesboules[1].cafe);
    printf("rayon [3] : %d", lesboules[2].cafe);

return 0 ;
}

les 8 octet du malloc par Boule ne suffit pas parceque la structure est plus grande, du coup

tabpointer: malloc.c:2403: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.

Abandon (core dumped)

:cool:

shmemory
shmemory
Niveau 8
17 novembre 2016 à 21:19:21

Le 17 novembre 2016 à 21:01:45 IssouAlChancla a écrit :
Tu met sizeof *lesboules ça marche tout le temps et ça t'évite des erreurs comme ça

ça ne marche qu'avec les ** ?
PArce que du coup dans le dernier code que j'ai posté, ce serait sizeof quoi ? :( l'idée était de retrovuer la même valeur que sizeof(Boule)

IssouAlChancla
IssouAlChancla
Niveau 9
17 novembre 2016 à 23:00:11

Le 17 novembre 2016 à 21:19:21 shmemory a écrit :

Le 17 novembre 2016 à 21:01:45 IssouAlChancla a écrit :
Tu met sizeof *lesboules ça marche tout le temps et ça t'évite des erreurs comme ça

ça ne marche qu'avec les ** ?
PArce que du coup dans le dernier code que j'ai posté, ce serait sizeof quoi ? :( l'idée était de retrovuer la même valeur que sizeof(Boule)

c'est la méthode la plus logique pour utiliser malloc, ça marche tous le temps.
Si lesboules est de type (Boule *) alors *lesboules est de type (Boule)
T'as plus à te préocuper du type des lesboules ça pourrait être un (int *) ce serait pareil

shmemory
shmemory
Niveau 8
18 novembre 2016 à 08:45:13

Ahhh oui ok, c'est une etoile pour dire de dépointer :cimer:

Alex6360
Alex6360
Niveau 36
19 novembre 2016 à 23:03:52

Normalement tu es censé faire un malloc sur le tableau de pointeurs et sur chaque case à l'intérieur de ce tableau .

shmemory
shmemory
Niveau 8
20 novembre 2016 à 08:41:10

Normalement tu es censé faire un malloc sur le tableau de pointeurs et sur chaque case à l'intérieur de ce tableau .

Non parce qu'ici mon but était de faire un tableau de pointeurs ( un *Boule[] en fait) et pas un tableau double dimensions de Boule (Boule[][]) :oui:

Alex6360
Alex6360
Niveau 36
20 novembre 2016 à 14:58:39

Justement, si tu fais un tableau de pointeurs, il faut allouer la taille du tableau, et aussi l'espace sur lequel les pointeurs à l'intérieur de ce tableau vont pointer.

IssouAlChancla
IssouAlChancla
Niveau 9
21 novembre 2016 à 16:35:04

Le 20 novembre 2016 à 14:58:39 Alex6360 a écrit :
Justement, si tu fais un tableau de pointeurs, il faut allouer la taille du tableau, et aussi l'espace sur lequel les pointeurs à l'intérieur de ce tableau vont pointer.

Tous ses pointeurs pointent vers
Boule a = { .rayon=95, .chat=66, .truc=987 } ;
donc c'est bon. Après c'est juste un exemple son code il fait rien

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment