Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Warum geht der Zugriff nicht???

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
04.12.2006, 18:28 Uhr
Getit




Code:
#include <malloc.h>
#include <iostream>
using namespace std;

int main()
{
    void *ptr;
    ptr = malloc(999);
    size_t size = _msize(ptr);
    cout << size << endl;
    
    for (int i = 0; i < size; i++)
    {
        *(((int*)ptr) + i) = i;
    }
    
    system("PAUSE");
}



Warum schlägt der Zugriff in der Schleife fehl????
Habe mir doch den Speicher geholt (und Sicherheitshalber auch mal ausgeben lasse) - also muss die Speicherstelle doch existieren, oder?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.12.2006, 18:50 Uhr
Pler
Einer von Vielen
(Operator)


Das funktioniert nicht, da so ziemlich alles was du geschrieben hast falsch ist.


C++:
#include <malloc.h>
#include <iostream>
using namespace std;

int main()
{
    int *ptr;
    ptr = (int*)malloc(999*sizeof(int));

    for (int i = 0; i < 999; i++)
    {
        *((ptr) + i) = i;
    }

    for(int i = 0; i < 999; i++)
    {
        printf( "%d\n" , ptr[i] );
    }
}



Zuerstmal sollte der Zeiger nicht void sein. Und in 999 Bytes Speicher passen keine 999 ints. -> Daher malloc(999*sizeof(int));
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.12.2006, 18:57 Uhr
Getit



Danke!!!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.12.2006, 20:51 Uhr
ao

(Operator)


Noch mehr Fehler:

malloc ohne free -> Speicherleck

Und: In C++ nimmt man besser new und delete als malloc und free, das erspart auch diesen ekligen Typecast beim Speicherholen.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.12.2006, 20:56 Uhr
Pler
Einer von Vielen
(Operator)


Ja.
Also bitte meine "Verbesserung" nicht als gutes Programm hernehmen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
05.12.2006, 10:04 Uhr
Getit



Trotzdem herzlichen Dank
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
05.12.2006, 11:31 Uhr
0xdeadbeef
Gott
(Operator)


Wenn schon C, dann richtig:

C++:
#include <malloc.h>
#include <stdio.h>

static int const size = 999;

int main(void)
{
    int *ptr;
    ptr = (int*) malloc(size * sizeof(int));

    for (int i = 0; i < size; ++i)
    {
        ptr[i] = i;
    }

    for(int i = 0; i < size; ++i)
    {
        printf("%d\n" , ptr[i]);
    }

    free(ptr);

    return 0;
}


Wenn C++, dann

C++:
#include <iostream>

namespace {
    int const size = 999;
}

int main() {
    int *ptr = new int[size];

    for(int i = 0; i < size; ++i) {
        ptr[i] = i;
    }

    for(int i = 0; i < size; ++i) {
        std::cout << ptr[i] << std::endl;
    }

    delete[] ptr;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
05.12.2006, 11:44 Uhr
Pler
Einer von Vielen
(Operator)


@0xdeadbeef:
Aber wenn der Dozent der Meinung ist, er muss den Leute sone Mischung aus beidem beibringen, dann kannst du das auch erst mal nicht ändern.
Und die Frage hier ging ja um ein konkretes Problem und nicht, "wie würde ich das am besten in C oder C++ machen".
Offensichtlich haben die hier den c++ io-style und c-stlye für Speicher gelernt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
05.12.2006, 12:23 Uhr
0xdeadbeef
Gott
(Operator)


Trotzdem, wenn du printf benutzen willst, musst du zumindest cstdio einbinden.

Und dass der Dozent keine Ahnung hat, ist kein Grund, es falsch zu lernen, oder?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
05.12.2006, 13:07 Uhr
Pablo
Supertux
(Operator)


Wobei ich anmerken muss, dass malloc laut Standard in stdlib.h definiert ist [klugscheisser](und man sollte nach malloc auch nach NULL Pointern überprüfen )[/klugscheisser]
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: