Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

malloc i free, free zawiesza program

Ostatnio zmodyfikowano 2014-09-27 12:36
Autor Wiadomość
Hexbinary
Temat założony przez niniejszego użytkownika
malloc i free, free zawiesza program
» 2014-09-27 11:24:53
Mam taki kod i nie wiem czemu free zawiesza program.

C/C++
#include <iostream>
#include <stdlib.h>
int Rand( int mx, int mn ) {
    return rand() %( mx - mn + 1 ) + mn;
}
int main( int argc, char ** argv ) {
    int * tab =( int * ) malloc( sizeof( int ) * 255 );
    int * tab_p = tab;
    int * tab_k = tab + sizeof( int ) * 255;
    for( tab = tab_p; tab < tab_k; tab += sizeof( int ) ) {
        * tab = Rand( 10, 1 );
    }
    for( tab = tab_p; tab != tab_k; tab += sizeof( int ) ) {
        std::cout << "addr : " << tab << " value : " << * tab << "\n";
    } std::cout << "ADDR : " << tab << " value : " << * tab << "\n";
    tab = tab_p;
    free( tab ); //Czemu zawiesza program ??
    return 0;
}
P-117651
OSA_PL
» 2014-09-27 11:40:07
To nie free zawiesza program, tylko przekraczasz rozmiar zaalokowanej pamięci.

C/C++
int * ptr;
//alokacja
ptr++; //to automatycznie przeskoczy o ilość bajtów jaką ma dany typ
P-117652
Hexbinary
Temat założony przez niniejszego użytkownika
» 2014-09-27 12:01:27
Mógłbyś naprawić ten kod bo się męczę i nadal nie wiem w którym miejscu, przekraczam to też nie działa, mimo ,że ustawiłem wskaźnik bliżej niż koniec tablicy. Może źle licze pamięć??
C/C++
#include <iostream>
#include <stdlib.h>
int Rand( int mx, int mn ) {
    return rand() %( mx - mn + 1 ) + mn;
}
int main( int argc, char ** argv ) {
    int * tab =( int * ) malloc( sizeof( int ) * 255 ); //1020 bajtow int ma 4 bajty
    int * tab_p = tab;
    int * tab_k = tab + sizeof( int ) * 255 - 4; // tez nie dziala
    std::cout << "addr : tab_k " << tab_k << " value: " << * tab_k << "\n";
    int i = 0;
    for( tab = tab_p; tab < tab_k; tab += sizeof( int ) ) {
        * tab = Rand( 10, 1 );
        ++i;
    }
    std::cout << "Petla wykonala sie " << i << "\n"; i = 0;
    for( tab = tab_p; tab < tab_k; tab += sizeof( int ) ) {
        std::cout << "addr : " << tab << " value : " << * tab << "\n";
        ++i;
    } std::cout << "ADDR : " << tab << " value : " << * tab << "\n";
    std::cout << "Petla wykonala sie " << i << "\n"; i = 0;
    tab = tab_p;
    free( tab ); //Czemu zawiesza program ??
    return 0;
}
P-117654
OSA_PL
» 2014-09-27 12:11:13
C/C++
int * tab_k = tab + sizeof( int ) * 255;
/*
Gdy zrobisz coś takiego wskaźnik tab_k nie wskazuje na element tab[255], tylko na tab[4*255](zakładając, że na platformie której używamy int ma 4 bajty). Jak chcesz by wskazywał na tab[255] robisz tak: int * tab_k = tab + 255; kompilator załatwi za Ciebie te liczenie bajtów.

To samo masz w pętlach: tab += sizeof( int ) - tu powinno być po prostu tab++
*/
P-117655
Leon90
» 2014-09-27 12:18:46
P-117656
Hexbinary
Temat założony przez niniejszego użytkownika
» 2014-09-27 12:36:55
Dzięki za pomoc już wszystko rozumiem :P i wszystko działa.
P-117658
« 1 »
  Strona 1 z 1