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

Zarządzanie pamięcią C - realloc w funkcji

Ostatnio zmodyfikowano 2018-05-15 23:58
Autor Wiadomość
pekfos
» 2018-05-15 23:04:22
To nie odpowiada na żadne z tych dwóch pytań. To że ten kod działa tam bez dodatkowego wskaźnika, poddaje w wątpliwość, że chodzi tu o język C. Edytor tekstowy nie ma tu nic do rzeczy.
P-171135
desperat96
Temat założony przez niniejszego użytkownika
» 2018-05-15 23:09:46
Jaki kompilator tam jest to dokładnie nie wiem, a na pytanie jak kompiluję nie potrafię odpowiedzieć, naciskam kompiluj i kompiluje.
P-171136
jankowalski25
» 2018-05-15 23:12:25
wskaźnik jest przekazywany przez referencję
Nie jest, domyślnie wszystko ląduje na stos i jest przekazywane przez wartość (zwłaszcza w C, gdzie referencje nie istnieją). Jeśli chcesz, aby był, to należy użyć
typ *&
, ale to już nie jest C, tylko C++. Chyba że robisz jakieś czary z rzutowaniami na
void *
 (wtedy zawsze wystarczy jedna gwiazdka), ale to by było nierozsądne...

Dopisano:
Hmm... a nie zwracasz przypadkiem z funkcji zmodyfikowanego wskaźnika? W sumie to lepiej podaj kod, może są jakieś istotne różnice, które nie padły w temacie.
P-171137
desperat96
Temat założony przez niniejszego użytkownika
» 2018-05-15 23:21:44
Kod
C/C++
#include <stdlib.h>
#include <stdio.h>
void red( int ** );
int main()
{
    int * wsk, i;
    wsk =( int * ) malloc( 15 * sizeof( int ) );
    for( i = 0; i < 15; i++ )
    {
        wsk[ i ] = i + 100;
        printf( "%d numer wskaznika:%p \n", wsk[ i ], wsk + i );
    }
   
    printf( "\n\n" );
    red( & wsk ); //wskaznik = realloc(wskaznik,20*sizeof(int));
    printf( "\n\n" );
    for( i = 0; i < 20; i++ )
    {
        printf( "%d numer wskaznika:%p \n", wsk[ i ], wsk + i );
    }
    free( wsk );
    return 0;
}
void red( int ** wskaznik )
{
    * wskaznik = realloc( * wskaznik, 20 * sizeof( int ) );
}

Znaczy robiłem wszystko tak, no i prowadzący powiedział żebym tak nie robił, pokazał jak robić na komputerze uczelnianym(czyli bez dodatkowego wskaźnika), tam zadziałało, a u mnie nie działa bez dodatkowego wskaźnika.
P-171138
pekfos
» 2018-05-15 23:28:56
P-171139
desperat96
Temat założony przez niniejszego użytkownika
» 2018-05-15 23:33:42
mingw32-gcc.exe   -c C:\Users\Kamil\Desktop\C\testy.c -o C:\Users\Kamil\Desktop\C\testy.o
mingw32-g++.exe  -o C:\Users\Kamil\Desktop\C\testy.exe C:\Users\Kamil\Desktop\C\testy.o  
Process terminated with status 0 (0 minute(s), 0 second(s))
0 error(s), 0 warning(s) (0 minute(s), 0 second(s))


Znaczy ja chyba mam podejrzenia czemu się tak dzieje, u mnie każdy realloc zmnienia adres, a na uczelni z tego co zauważyłem adresy się nie zmieniaja(jakby dac odpowiednio długi to pewnie by sie zmieni), dlatego potem w mainie wszystko działa.
P-171140
pekfos
» 2018-05-15 23:49:57
realloc() nie musi dokonać realokacji, więc może być tak jak piszesz. Zachowanie może się różnić między systemami. Zażądanie odpowiednio większej ilości pamięci powinno wywołać zmianę adresu i najlepiej taki przypadek pokaż prowadzącemu. Bo ten wskaźnik jest tu konieczny.
P-171141
desperat96
Temat założony przez niniejszego użytkownika
» 2018-05-15 23:58:39
Dobra, dzięki wielkie, kolega którego system zachowywał się podobnie jak uczelniany sprawdził i gdy bez wskaźnika do wskaźnika powiększył z 15 do 2000 reallociem w funckci, to mu się wywaliło i stracił w mainie wskaźnik do nowego obszaru, a z wskaźnikiem do wskaźnika wszystko działa. Dzięki wielkie jeszcze raz.
P-171142
1 « 2 »
Poprzednia strona Strona 2 z 2