Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » new int[3]

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 <
000
06.04.2007, 00:32 Uhr
Lensflare



Hallo.

ich habe einen kleinen testcode geschrieben in dem ich ein dynamisches array erstelle:


C++:
#include <stdio.h>

int main()
{
  int *a;
  a = new int[3];
  a[7] = -1;
  printf("%i\n", a[7]);
  
  getchar();
}



Ich habe erwartet, dass es einen Laufzeitfehler geben wird, weil ich Speicher für 3 Integer reserviert habe und mit a[7]=-1; auf unreservierten Bereich schreibe.

Aber es gibt keinen Laufzeitfehler.

Könnt ihr mir sagen warum? Habe ich da etwas missverstanden?
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.04.2007, 00:50 Uhr
Blubber2063



Naja der Laufzeitfehler muss nicht auftreten, der Speicher dort kann durchaus noch dir gehören, das kann aber Heap Verwaltungsinfo sein, oder der Rest von der passenden Seite den die Heap Verwaltung noch vergeben kann, ist also möglich das die Stelle dort überschrieben wird.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.04.2007, 02:05 Uhr
Lensflare



ok. jetzt habe ich noch eine andere Frage.
Wie mache ich das mit "new" wenn ich ein zweidimensionales array haben will?

C++:
  int **a;
  a = new int[3][5]; //geht nicht


--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.04.2007, 09:56 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


entweder


C++:
int **a;
a = new int*[3];
for(i = 0; i < 3; ++i)
   a[i] = new int[3];




"Gefahr" hier dabei ist halt das man natürlich nicht mit fwrite(a, sizeof(int), 9, file); abspeichern kann, sondern nur jede zeile einzeln (man muss auch jede zeile einzeln wieder freigeben!)

oder du benutzt ein 1D-Array:


C++:
int *a;
a = new int[3*3];




und dann eben a[y*height+x] als position (könnte evtl sogar vom zugriff schneller sein)
ist jedenfalls einfacher zu verwalten.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.04.2007, 01:50 Uhr
Lensflare



Alles klar. Danke.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.04.2007, 00:32 Uhr
~OSTERHAASE
Gast



Zitat von Lensflare:
ok. jetzt habe ich noch eine andere Frage.
Wie mache ich das mit "new" wenn ich ein zweidimensionales array haben will?

C++:
  int **a;
  a = new int[3][5]; //geht nicht





C++:
  int (*a)[5];
  a = new int[3][5]; // so gehts !
  a[0][1] = 4711;



 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.04.2007, 01:18 Uhr
0xdeadbeef
Gott
(Operator)


Es ist wichtig zu verstehen, dass new[] nur eindimensional alloziiert. Das bedeutet zum Beispiel,

C++:
int main() {
  int x = 3, y = 4;

  delete[] new int[x][y];
}


Ist so nicht möglich, weil y keine Konstante ist. Der Ausdruck

C++:
int (*a)[5] = new int[x][5];


alloziiert ein Array von x Elementen des Typs int[5], d.h. sizeof(*a) == sizeof(int) * 5. Der erstellte Speicherbereich ist flach, wie bei Arrays üblich, und deswegen gibts auch kein delete[][] oder vergleichbares.

Üblicherweise nimmt man in solchen Fällen einen flachen Speicherbereich und macht den Umbruch von Hand, also

C++:
int dimx = 10, dimy = 20;
int x = 2, y = 3;

int *a = new int[dimx * dimy];

a[y * dimx + x] = 3;


...oder man macht es halt von Hand. Oder, am besten, man benutzt boost.multi_array.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: