2010-05-07 3 views
5
struct ptr{ 
    int node; 
    ptr *next; 
    ptr(){} 
    ptr(int _node, ptr *_next){ node=_node; next=_next; } 
}; 
struct list_t{ 
    ptr *sht; 
    int size; 
    void push(int node){ 
     size++; 
     sht=new ptr(node,sht); 
    } 
}shthead[100001], comp[200001], tree[200001]; 

Le struct ptr est utilisé comme une liste chaînée. Mais quand je débogue le code dans gdb, j'ai trouvé que les ptr * étaient tous convertis en void *.
sortie GDB:C++: pourquoi un pointeur auto d'une struct change automatiquement void *

(gdb) pt ptr 
type = struct ptr { 
    int node; 
    void *next; 
    public: 
    ptr(void); 
    ptr(int, void *); 
}

Cependant, je peux encore voir les données de la struct si je les Covert retour à ptr * gdb.
Quelle est la raison pour cela s'il vous plaît? J'utilise Arch Linux, GNOME, g ++ 4.5.0, gdb 7.1. Sans drapeaux de compilation mais un -g.
This GDB was configured as "i686-pc-linux-gnu"

+0

Il montre '' * ptr sur mon système. Quels drapeaux de compilation avez-vous utilisés? Quelle version de g ++ et gdb? – Thomas

+0

Etrange, j'utilise aussi gdb 7.1, mais g ++ 4.4.3. Les notes de version 4.5 ne suggèrent aucun changement dans cette direction. http://gcc.gnu.org/gcc-4.5/changes.html – Thomas

+0

Juste pour remplir plus de points de données, en utilisant gdb 7.0.1 j'obtiens la réponse correcte avec g ++ 4.2.4 et 4.3.3 mais avec 4.5. 0 gdb montre le pointeur comme un «void *». On dirait un bug dans gcc (ou gdb?) –

Répondre

1

fonctionne bien pour moi sur OS X.

(gdb) pt ptr 
type = class ptr { 
    public: 
    int node; 
    ptr *next; 

    ptr(void); 
    ptr(int, ptr *); 
} 

version gdb:

Shadow:code dkrauss$ gdb -v 
GNU gdb 6.3.50-20050815 (Apple version gdb-1346) (Fri Sep 18 20:40:51 UTC 2009) 
Copyright 2004 Free Software Foundation, Inc. 
GDB is free software, covered by the GNU General Public License, and you are 
welcome to change it and/or distribute copies of it under certain conditions. 
Type "show copying" to see the conditions. 
There is absolutely no warranty for GDB. Type "show warranty" for details. 
This GDB was configured as "x86_64-apple-darwin". 
0

Il convient de mentionner que "ptr" n'est/pas/un pointeur intelligent, c'est juste une structure, qui n'a même pas de destructeur.

(pointeurs intelligents ont un très précis sens dans le pays de C)

+0

Eh bien, je suis vraiment désolé pour ça. Je n'aurais pas dû dire "un pointeur intelligent" ici avec une vague compréhension d'eux. Le texte a été corrigé maintenant. – Stone

+0

Aucun mal fait. :) – Arafangion