Feld von Pointern auf NULL setzen



  • Hi Leute!

    Ich möchte mit

    hashing::hashing(int m) : size(m)
    {
    	int** feld = new int*[m];
    
    	for(int i=0; i<size; i++)
    	{
    		*feld = 0;
    		feld++;
    	}
    }
    

    ein Feld von Pointern auf NULL setzen. Wenn ich danach das Feld von Pointern auf NULL abfrage, nämlich so

    if(feld[idx] == NULL)
    	{
    		return 1;
    	}
    	else
    	{
    		return 0;
    	}
    

    dann meckert der Compiler, dass es eine "unbehandelte Ausnahme, bei..., ... Zugriffsverletzung..." gibt.

    Was mache ich falsch?



  • vip@r schrieb:

    dann meckert der Compiler, dass es eine "unbehandelte Ausnahme, bei..., ... Zugriffsverletzung..." gibt.

    Logisch.

    vip@r schrieb:

    Was mache ich falsch?

    Du verwendest (immer noch) keinen std::vector. Irgendwelche Gründe für diese fatale Entscheidung?



  • hashing::hashing(int m) : size(m)
    {
    	for(int i=0; i<size; i++)
    	{
    		*feld = 0;
    		feld++;
    	}
    }
    

    Im Schleifenrumpf verwendest du i gar nicht.


  • Mod

    Lass mich raten: Das feld ist gar nicht das feld aus hashing::hashing.

    Wenn du in C++ jemals new für Felder benutzt, machst du fast mit Sicherheit was falsch. Besonders wenn du schon am Unterschied zwischen lokalen und Membervariablen strauchelst. Nimm vector, dann passieren auch weniger von diesen vermeidbaren Fehlern.

    P.S.: Ich sehe gerade, dieser Tipp wurde dir in der Vergangenheit schon mehrfach gegeben. Das ist irgendwie selber schuld. Wenn du die Ratschläge nicht verstehst, dann musst du eben erst einmal mehr von der Sprache lernen. Hier im Forum ist viel Lehrmaterial angegeben. vector gehört zum Grundumfang der Sprache, new ist unnötig fehleranfällig. Wenn du es trotz mehrfacher Warnung weiter benutzt, dann wirst du deine selbstgemachten Probleme auch selber lösen müssen.



  • out schrieb:

    hashing::hashing(int m) : size(m)
    {
    	for(int i=0; i<size; i++)
    	{
    		*feld = 0;
    		feld++;
    	}
    }
    

    Im Schleifenrumpf verwendest du i gar nicht.

    -Außerdem ist feld lokal.
    -Außerdem ist die Abfrage auf NULL oft zweifehlhaft.
    -Außerdem wieso new?

    Mehr fällt mir grad nicht auf. Aber das kannst du nu erstmal korrigieren 🙂



  • out schrieb:

    hashing::hashing(int m) : size(m)
    {
    	for(int i=0; i<size; i++)
    	{
    		*feld = 0;
    		feld++;
    	}
    }
    

    Im Schleifenrumpf verwendest du i gar nicht.

    Das ist ok. Problematisch könnte nur sein, dass feld nachher ins Nirgendwo zeigt.
    Trotzdem könnte man sich dieses nullen auch mit den richtigen Parametern für new oder mit memset schneller erledigen lassen. Aber vip@r ist halt ein echter l0wl3v3l h4xx0r!11



  • vip@r schrieb:

    dann meckert der Compiler, dass es eine "unbehandelte Ausnahme, bei..., ... Zugriffsverletzung..." gibt.

    Was mache ich falsch?

    Egal ob die Pointer NULL sind, idx darf die Feldgroesse nicht ueberschreiten.



  • -Außerdem ist feld lokal.
    -Außerdem ist die Abfrage auf NULL oft zweifehlhaft.
    -Außerdem wieso new?

    Feld ist nicht lokal. Feld steht in meiner Klasse. Siehe hier:

    class hashing
    {
    private:
    	int** feld;
    	int* elem;
    	int size;
    
    public:
    	hashing(int size);
    	~hashing();
    };
    

    Wie initialisiere ich nun das feld korrekterweise mit NULL?



  • vip@r schrieb:

    hashing::hashing(int m) : size(m)
    {
    	int** feld = new int*[m];
    
    	for(int i=0; i<size; i++)
    	{
    		*feld = 0;
    		feld++;
    	}
    }
    

    feld ist lokal. feld steht in deinem Konstruktor hashing.

    vip@r schrieb:

    Wie initialisiere ich nun das feld korrekterweise mit NULL?

    for(int i=0; i!=size; ++i)
        {
    		feld[i] = 0;
        }
    


  • int** feld = new int*[m]();
    

    🙂



  • out schrieb:

    for(int i=0; i!=size; ++i)
        {
    		feld[i] = 0;
        }
    

    Nur um das deutlich zu machen:
    Nicht feld nochmal deklarieren!
    Das verdeckt dann den Member.
    Richtig macht initialisiert man ein dynamisches Array so:

    foo::foo()
    : field_(42)
    {}
    

    Weils ein vector sein sollte.


Anmelden zum Antworten