Alokacja pamięci(malloc)

0

Witam,
piszę program, który ma rezerwować pamięć przed wprowadzaniem tekstu, a jeśli tekst będzie za długi ucinać go.

 
void rezerwacja()
{
	system("cls");
	printf("Wpisz rozmiar potrzebnej pamieci:");
	scanf("%d", &length);
	tab = (char*) malloc(length*sizeof *tab);
	printf("Zarezerwowano %d bajtow", length);
	system("pause");
	system("cls");
}

Mam kilka pytań co do kodu:

  1. Jak mam traktować tab, jako zmienną do której mogę wpisać dowolny wyraz? Nie bardzo wiem co z tym teraz zrobić tzn. jak wprowadzić jakieś dane do tej zarezerwowanej pamięci.
  2. Co się stanie jeśli wyraz będzie dłuższy niż zarezerwowana pamięć?
0
Desson napisał(a):
  1. Jak mam traktować tab, jako zmienną do której mogę wpisać dowolny wyraz? Nie bardzo wiem co z tym teraz zrobić tzn. jak wprowadzić jakieś dane do tej zarezerwowanej pamięci.

Jak wskaźnik, czyli odwołać się do pamięci, którą wskazuje, czyli traktujesz tab prawie jak tablicę

Desson napisał(a):
  1. Co się stanie jeśli wyraz będzie dłuższy niż zarezerwowana pamięć?

Zależy od mechanizmu, który zarządza stertą - najpewniej rzuci wyjątek i program się wysypie

tab = (char*) malloc(length*sizeof *tab);
na moje oko to nie powinno się kompilować

0

W poprzednim poście zabrakło deklaracji zmiennych, nie skopiowałem ich ;/

void main()
{
	char *tab;
	int length;

	system("cls");
	printf("Wpisz rozmiar potrzebnej pamieci:");
	scanf("%d", &length);
	tab = (char*) malloc(length*sizeof *tab);
	printf("Zarezerwowano %d bajtow\n", length);
	
	printf("Wpisz wyraz:\n");
	scanf("%c", &tab);
	printf("Wyraz:\n", *tab);
	system("pause");
	system("cls");
}
 

Zastanawia mnie dlaczego program nie pozwala mi wpisać wyrazu do drugiego scanf :( Co robię źle?

0

pokombinuj z opcją szerokości pola we scanfie. Tzn rezerwujesz sobie jakąś tablice charów np użytkownik podaje 10 to alokujesz 10 bajtów na tablice. Później stwórz jakiś string reprezentujący łańuch formatujący do scanfa i zmień szerokość pola na liczbę długości stringu która podał użytkownik, wszystko pozlepiaj ze sobą i wynikowy string wyślij do scanfa. Dzięki temu jak użytkownik poda za długi string to i tak zostanie on obcięty do szerokości pola.

0

Troche hack, ale działa:

char* read() {
    char* str = NULL;
    unsigned length;
    char format[20];
    printf("Give max length: ");
    scanf("%u", &length);
    str = malloc((length+1) * sizeof(char));
    sprintf(format, "%%%us", length);
    scanf(format, str);
    return str;
}

int main() {
    char* str = read();
    printf("%s\n", str);
    free(str);
    return 0;
}
0

Najprosciej to byloby chyba cos takiego:

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

int main() {
    char* array;
    int length = 0;
    
    printf("Wpisz rozmiar potrzebnej pamieci: ");
    scanf("%d", &length);
    getchar(); //pozbywamy sie entera w buforze wejscia
    
    array = (char*)malloc(sizeof(char) * length);
    printf("Zarezerwowano bajtow %d\n", length);
    
    printf("Podaj tekst: ");       
    fgets(array, length, stdin);    
    printf("Tekst z uwzglednieniem rozmiaru: %s\n", array);
    
    free(array);    
    return 0;
}

Od razu moze napisze, ze w jezyku C teksty zazwyczaj koncza sie zerowym bajtem. Dzieki temu funkcje typu printf wiedza kiedy przestac wypisywac tekst - wypisuja znaki na wyjscie az do napotkania wspomnianego zerowego bajtu. Pisze to poniewaz chcialbym podkreslic, ze liczba zarezerwowanej pamieci to nie zawsze to samo co liczba znakow dostepnych dla uzytkownika. Jezeli uzytkownik wpisze tekst "abc"(3 znaki) to w pamieci bedzie to wygladalo tak: "abc(zerowy bajt)"(4 znaki).

Z uwagi na powyzsze, jezeli uzytkownik zadeklaruje, ze potrzebuje 3 bajtow pamieci to ma do dyspozycji 3 bajty pamieci i po wpisaniu tekstu "abc" otrzyma w wyniku "ab". Jezeli Ci to przeszkadza to latwo mozna to obejsc rezerwujac pamiec o rozmiarze o jeden bajt wiecej niz podal uzytkownik.

  1. Jak mam traktować tab, jako zmienną do której mogę wpisać dowolny wyraz? Nie bardzo wiem co z tym teraz zrobić tzn. jak wprowadzić jakieś dane do tej zarezerwowanej pamięci.

Zerknij na kod

  1. Co się stanie jeśli wyraz będzie dłuższy niż zarezerwowana pamięć?

Dostales juz jedna odpowiedz, ze program moze sie wywalic, ale to jeszcze nie jest takie zle. Gorzej, jak program zacznie nadpisywac inne fragmenty pamieci - wtedy dzieja sie rozne dziwne rzeczy i tego typu bledy po pierwsze trudniej wykryc a po drugie trudniej naprawic.

PS.
Powyzszy kod to szkic. Wymaga pewnego dopracowania, obslugi bledow itp. itd.

1 użytkowników online, w tym zalogowanych: 0, gości: 1