Zastanawiałem się, dlaczego kod następujące isnt't pracyprzydzielić pamięci i zapisać ciąg w C
int main(int argc, char **argv)
{
char *test = (char*) malloc(12*sizeof(char));
test = "testingonly";
free(test);
}
Po myślenie o nim moje założenie, że pierwszy i przydzielić miejsca dla 12 znaków w pamięci, ale zadania w następna linia tworzy tablicę znaków na stosie, a jej adres pamięci jest przekazywany do przetestowania. Tak więc free() próbuje zwolnić miejsce na stosie, które nie jest dozwolone. Czy to jest poprawne?
Jakie byłoby właściwe podejście do zapisywania ciągu na stercie? Czy następujące sposoby są powszechne?
int main(int argc, char **argv)
{
char *test = (char*) malloc(12*sizeof(char));
strcpy(test, "testingonly");
free(test);
}
Pierwsze rozwiązanie ilustruje klasyczne wyciek pamięci; otrzymujesz wskaźnik do pamięci przydzielonej, a następnie tracisz jedyne odwołanie do niej, gdy przypisujesz wskaźnik do literału ciągu do 'testu'. Po tym czasie nie ma uzasadnionego sposobu odniesienia się do przydzielonej pamięci - wycieku. –
Nigdy nie wypisuj wyniku malloc w C, nie ma sensu i ukrywa tylko błędy i ostrzeżenia kompilatora. – Lundin
tak - użyj 'strcpy' lub' strncpy' lub 'memcpy'. strncpy jest lepszy niż strcpy, ponieważ pomaga uniknąć problemu z przepełnieniem bufora podczas kopiowania przy maksymalnej liczbie N znaków. –