Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » zum 10000sten mal: arrays

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
13.11.2003, 20:19 Uhr
kronos
Quotenfisch
(Operator)


hi!
im prinzip glaube ich die dinger ja begriffen zu haben, aber es läuft einfach nicht so wie ich es will. ist dieser array korrekt initialisiert:

C++:
/* T soll ein zweidimensionaler array variabler größe sein.
seine dimensionen seien der größe X und Y */


int **T,x,y;

T = (int**) malloc (X * sizeof(int *));

  for (x = 0; x < X)
  {
    T[x] = (int*) malloc (Y * sizeof (int));
    for (y = 0; y <Y; y++)
      T[x][y] = 0;
  }



müsste doch laufen oder?
leider tauchen später im programm irgendwelche irren werte in T auf, obwohl ich kein einziges mal etwas dort hinschreibe...
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.11.2003, 20:25 Uhr
0xdeadbeef
Gott
(Operator)


Das Array wird ja von Haus aus nicht initialisiert. Wenn du willst, das zu Anfang Nullen drinstehen, benutz calloc.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.11.2003, 20:38 Uhr
Pablo
Supertux
(Operator)


Ich habe folgendes gemacht, bei mir passiert nichts falsches:


C++:
#include <stdio.h>
#include <malloc.h>
int main()
{
    int **Array, x=5, y=6,i,j,counter=0;
    Array = (int**) malloc(x*sizeof(int*));
    // -büberprüfen, ob Array == NULL-A
    if(Array == NULL) {
    fprintf(stderr, "Kein Speicher\n");
    return 1;
    }
    
    for(i=0; i<y;++i) {
    Array[i] = (int*) malloc(y*sizeof(int));
    if (Array[i] == NULL) {
        fprintf(stderr, "Kein Speicher\n");
        for(j=0; j<i; ++j)
            free(Array[j]);
        free(Array);
        return 1;
    }
    for(j=0; j<y;++j)
        Array[i][j] = counter++;
    }

    for(i=0; i<x; ++i) {
    for(j=0;j<y; ++j)
        printf(" %d ", Array[i][j]);
    printf("\n");
    }

    for(i=0; i<y-1; ++i) // hä
      free(Array[i]); // wieso kann ich das nicht?
    
    free(Array);

    return 0;
}




Was ich nicht verstehen kann, wieso kann ich free(Array[ i ]); nicht ausführen. Ich kriege immer Segmentation Fault, keine Ahnung wieso. Ich habe ein Programm geschrieben, dass ein char** deklaiert hat und ich konnte schon free(file[ i ]); ausführen, aber als int** kann ich nicht, das verstehe ich nicht wieso.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.11.2003, 18:12 Uhr
kronos
Quotenfisch
(Operator)



Zitat:
0xdeadbeef postete
Das Array wird ja von Haus aus nicht initialisiert. Wenn du willst, das zu Anfang Nullen drinstehen, benutz calloc.

deshalb ja
C++:
  T[x][y] = 0;


@pablo:
so ungefähr hab' ich das ja auch gemacht.

und am anfang ist auch alles null. aber wenn das programm eine weile läuft tauchen irgendwelche kuriosen werte im array auf. und zwar in einer ganz bestimmten spalte, sonst hätte ich gesagt, ich habe irgendwo einen buffer-owerflow...
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.11.2003, 22:54 Uhr
0xdeadbeef
Gott
(Operator)


An welcher Stelle im Proramm passiert das denn?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.11.2003, 22:59 Uhr
Pablo
Supertux
(Operator)


Wenn ich sowas mache, wie im Post 002 kann ich nicht free benutzen, warum? Ich kann zwar


C++:
free(array[0][0]);



Aber das macht wenig Sinn, ich bekommen immer ein Warning, aber so bekomme ich keine Segmentation faluts.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 16.11.2003 um 23:00 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
17.11.2003, 08:46 Uhr
ao

(Operator)



Zitat:
Pablo Yanez Trujillo postete

C++:
free(array[0][0]);


Aber das macht wenig Sinn, ich bekommen immer ein Warning, aber so bekomme ich keine Segmentation faluts.

Trotzdem ist es ein Fehler. Du nimmst den Inhalt des ersten Elements, interpretierst ihn mit Gewalt als Zeiger und machst mit diesem Zeiger ein free.

Das ist Unsinn und stürzt nur zufällig nicht ab.

Merke: Nicht alles, was keinen Segfault gibt, ist ein korrektes Programm.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
17.11.2003, 14:17 Uhr
Pablo
Supertux
(Operator)


Deshabl habe ich gesagt: Aber das macht wenig Sinn!

Ich bin mir bewusst, dass das auch ein Fehler ist, mich hat aber gewundert, dass diese Operation keine Seg Falut verursacht hat. Aber wieso kann ich nicht free aufrufen????
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
17.11.2003, 14:34 Uhr
Tommix



Hallo,
Du hast x und y vertauscht:

C++:
#include <stdio.h>
#include <malloc.h>
int main()
{
    int **Array, x=5, y=6,i,j,counter=0;
    Array = (int**) malloc(x*sizeof(int*));
    // .-büberprüfen, ob Array == NULL.-A
    if(Array == NULL) {
    fprintf(stderr, "Kein Speicher\n");
    return 1;
    }
    
    for(i=0; i<x;++i) { // <<< einmal hier
    Array[ i ] = (int*) malloc(y*sizeof(int));
    if (Array[ i ] == NULL) {
        fprintf(stderr, "Kein Speicher\n");
        for(j=0; j<i; ++j)
            free(Array[j]);
        free(Array);
        return 1;
    }
    for(j=0; j<y;++j)
        Array[ i ][j] = counter++;
    }

    for(i=0; i<x; ++i) {
    for(j=0;j<y; ++j)
        printf(" %d ", Array[ i ][j]);
    printf("\n");
    }

    for(i=0; i<x; ++i) //  <<< und hier.
      free(Array[ i ]); // wieso kann ich das nicht?
    
    free(Array);

    return 0;
}



Gruss, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
17.11.2003, 15:57 Uhr
Pablo
Supertux
(Operator)


tja, allerdings, das habe ich wohl gar nicht gemerkt, wie blöd muss man sein, um sowas zu vertauschen und ich habe mich schon gefragt, warum das wohl nicht ging.
--
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 <     [ 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: