Alokacja przez funkcje - gdzie blad??

soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

Alokacja przez funkcje - gdzie blad??

Post autor: soku11 »

WITAM!!
Mam kawalek kodu:

Kod: Zaznacz cały

int main()
{
  char *napis;
  funkcja(napis);
  printf("%s", napis);
	return 0;
}

void funkcja(char *name)
{
  char pliczek[5]={ '1','.','t','x' };
  int x;
  name=(char*)malloc(sizeof(pliczek));
	for(x=0;x<5;x++) name[x]=pliczek[x];
	
	if(name)
	{
		printf("Udana allokacja pamieci!\n");
		return;
	}
	else
	{
		printf("Nieudana allokacja pamieci!\n");
		return; 
	}
}

Przy probie wyswietlenia nowo zaalokowanego ciagu znakow program sie wylacza :( Co jest tego powodem?? POZDRO
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

Alokacja przez funkcje - gdzie blad??

Post autor: smiechowiec »

Wydaje mi się, że przekazujesz jako parametr zmienną wskaźnikową czyli typu int, o niezadeklarowanej wartości, a oczekujesz, że funkcja w C zmieni jej wartość, ale chyba nie tędy droga.
Gdybyś podał konkretny wskaźnik wtedy w funkcji mógłbyś wpisać coś do tego obszaru np

w main()
char napis[5]
funkcja(napis);
a w pętli podstawiasz, lokowanie pamięci nie jest wówczas potrzebne.

Myślę, że spojrzenie na wartość wskaźnika da Ci wskazówkę, spróbuj kod

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>


void funkcja(char *name) {
  char pliczek[5]={ '1','.','t','x', 0 };
  int x;
  name = (char*)malloc(sizeof(pliczek));
    for(x=0;x<5;x++) name[x]=pliczek[x];
   
    if(name)    {
        printf("Udana allokacja pamieci!\n");
        printf("zmienna name = %i\n", name);
        return;
    }
    else   {
        printf("Nieudana allokacja pamieci!\n");
        return;
    }
} 

int main(int argc, char* argv[]) {
  char *napis;
  printf("zmienna napis = %i\n", napis);
  funkcja(napis);
  printf("zmienna napis = %i\n", napis);
    return 0;
}
Aby to działało zgodnie z zamysłem wystarczy zwrócić wskaźnik z funkcji.
Jeśli z niego nie korzystamy nie ma potrzeby przekazywania go funkcji, wystarczy zmienna lokalna.

Kod: Zaznacz cały

char *funkcja() {
  char *name;
  char pliczek[5]={ '1','.','t','x', 0 };
  int x;
  name = (char*)malloc(sizeof(pliczek));
    for(x=0;x<5;x++) name[x]=pliczek[x];
   
    if(name)    {
        printf("Udana allokacja pamieci!\n");
        return name;
    }
    else    {
        printf("Nieudana allokacja pamieci!\n");
        return NULL;
    }
} 

int main(int argc, char* argv[]) {
  char *napis;
  napis = funkcja();
  printf("%s", napis);
    return 0;
}
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

Alokacja przez funkcje - gdzie blad??

Post autor: soku11 »

Nom rzeczywiscie twoj kod dziala prawidlowo... Jednak nadal ciekawi mnie blad w tym moim. Przeciez w main tworze wskaznik na znak. Funkcja dostaje ten wskaznik, tak wiec moze na nim robic co tylko sobie chce. Alokujac pamiec mam wskaznik na poczatek jakiegos ciagu znakow. Po przypisaniu funkcja konczy swoje dzialanie wracajac do main. A przeciez w main ten wskaznik tez jest dotepny, tylko wskazuje teraz na poczatek juz zaalokowanej pamieci z gotowymi danymi... Nie widze sensu wykrzaczanai sie tego programu :/ Gdzie jest blad w moim rozumowaniu?? POZDRO
unikat900
Użytkownik
Użytkownik
Posty: 95
Rejestracja: 10 lis 2007, o 09:27
Płeć: Mężczyzna
Lokalizacja: Wawa
Podziękował: 28 razy
Pomógł: 5 razy

Alokacja przez funkcje - gdzie blad??

Post autor: unikat900 »

Program być może się wyłącza, nie ze względu na jakiś błąd w rozumowaniu, a brak wywołania funkcji system("pause") na końcu programu. Spróbuj tak:

int main()
{
char *napis;
funkcja(napis);
printf("%s", napis);
system("pause");
return 0;
}

Resztę pozostaw bez zmian.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

Alokacja przez funkcje - gdzie blad??

Post autor: soku11 »

Hehe no bez przesady... Troche programowalem i odrozniam takie bledy Ale mimo wszystko dzieki za checi. BTW. Program zwraca return code -123123... i dodatkowo wyskakuje okienko dr watsona czy jakos tak POZDRO
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

Alokacja przez funkcje - gdzie blad??

Post autor: smiechowiec »

soku11 pisze:w main tworze wskaznik na znak.
Funkcja dostaje ten wskaznik, tak wiec moze na nim robic co tylko sobie chce.
Czy uruchomiłeś program, który Ci zaproponowałem ?
Chodzi o to że do funkcji przekazujesz wartość wskaźnika czyli adres na który wskazuje, sam wskaźnik nie jest przekazywany bo musiał byś użyć referencji.
Wskaźnik w main ma wartość nieokreśloną, więc nie wskazuje na konkretny obiekt.
W funkcji podstawiasz pod zmienną lokalną, więc oryginalny wskaźnik nie zmienia wartości.
Trzeba rozróżnić dwie rzeczy zmienną wskaźnika i to na co ona wskazuje, do funkcji przekazujesz jedynie to na co wskaźnik wskazuje
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

Alokacja przez funkcje - gdzie blad??

Post autor: soku11 »

Ok. Teraz juz rozumiem wszystko Dzieki naprawde duzo mi pomagasz w programowaniu. Jak bede mial jeszcze jakis problem to na pewno sie odezwe.
BTW. Twoj programik oczywiscie dziala jak powinien(na poczatku tak sam chcialem napisac, ale pokorcilo mnie zeby uzyc jako argumentu...)

POZDRO
ODPOWIEDZ