/ / Array in C and malloc - c, malloc

Tablica w C i malloc - c, malloc

1.Jak dwa wymiary przechowywane w pamięci są kolejne? (Mam na myśli int [M] [N], a nie alokację dynamiczną, myślę, że int [M] [N] wydarzyło się w obszarze stosu, więc ciągłe, czyż nie?)

2. Czy powierzchnia przydzielona przez malloc must jest kolejna?

3.Jeśli nie ma potrzeby dynamicznego przydzielania miejsca w pamięci, gdzie powinienem użyć? stos lub sterty. Na przykład, Chcę tablicy char przechowywania do 10000 znaków, więc powinienem użyć:

char a[10000];

lub

char *a = calloc(sizeof(char),10000);

Czy "stos wywołań funkcji" znajduje się w tym samym obszarze co stos zmiennych? W tym samym stosie lub innym?

Odpowiedzi:

4 dla odpowiedzi № 1

W int numbers[m][n] n są kolejnymi wartościami w pamięci, np. numbers[0][0] jest obserwowany przez numbers[0][1].

Z drugiej strony, powiedzmy n = 10, a następnie numbers[m][9] jest obserwowany przez numbers[m+1][0].

malloc zwraca kolejną pamięć. Ty decydujesz, jak z niego korzystać.

Tablica 10000 bajtów na stosie nie stanowi problemu, chyba że funkcja jest rekurencyjna i (jak zauważa Carey), chyba że pracujesz w środowisku małego stosu, tj. osadzone.

Tak, kod pocztowy i zmienne lokalne są identyczne.


1 dla odpowiedzi nr 2
  1. Pamięć jest ciągła. Wszystkie elementy w jednym wymiarze będą kolejno następujące po kolejnym wymiarze.

  2. Tak. Cała pamięć przydzielona przez pojedyncze połączenie malloc() jest ciągły.

  3. Jeśli potrzebujesz dużo pamięci, zalecam jej dynamiczne przydzielanie. Za mniej pamięci można przydzielić statycznie. malloc() robi użyj sterty. Nie polecam stosu, z wyjątkiem tylko bardzo małych ilości pamięci.


1 dla odpowiedzi nr 3

Kiedy przydzielisz coś [a] [b], czy jest ono ciągłe?

tak

Kiedy tworzyłem gry z mapami w kafelkach, miałem nawet dostęp do płytki za pomocą wskaźnika w renderingu.

Tzn .: jeśli mapa była 10x10, renderowałbym kafelek [1] [3] przy użyciu arrayName[14] na przykład.

Pamiętaj też, używając tego faktu, że w niektórychmiejsca, [b] zamiast [a] to, co będzie całkowicie w pamięci, może to powodować błędy, jeśli polegasz na kodzie pochodzącym z FORTRAN (jak CBLAS) lub w niektórych konkretnych urządzeniach i sytuacjach (jak niektóre GPU z niektórymi poszczególni kierowcy).

Kiedy używasz malloc, musi być ciągły?

Tak, i nie powiedzie się, jeśli pamięć ciągła nie jestdostępny. Powszechnym błędem jest oczekiwanie, że program zadziała, ponieważ całkowita wolna pamięć istnieje, bez uwzględniania fragmentacji pamięci.

Zrobiłem kiedyś grę, która nie zadziałała, ponieważ onamiał 30 MB pamięci, ale nie mógł załadować obrazu o wielkości 16 MB ... Nie zdawałem sobie wówczas sprawy, że fragmentacja pamięci spowodowana przez mój kod uniemożliwiła dostęp do bloku 16 MB.

Jeśli nie ma potrzeby przydzielania dynamicznego, powinienem użyć stosu lub sterty?

W C alokacja dynamiczna zwykle oznacza alokację sterty, a nawet wczesne książki C wręcz jednoznacznie to mówią malloc i podobna rodzina funkcji (calloc włączone) działają tylko na stercie. podczas gdy automatyczne przydzielanie próbuje użyć stosu.


0 dla odpowiedzi nr 4

C nie obsługuje tablic 2D. Obsługuje tablice tablic i tablic wskaźników do tablic, z których każda może być użyta jak tablica 2D, ale nie są wcale takie same, a żadna z nich nie jest tak naprawdę tablicą 2D.

Tablica zajmuje ciągłe lokalizacje w pamięci. Więc gdy masz tablicę tablic, każda podprzestrzeń jest pojedynczo przyległa, a te tablice są rozmieszczane w pamięci jeden po drugim, czyniąc całą rzecz przylegającą.

Kiedy masz tablicę wskaźników do tablic,każda podtablica jest pojedynczo przyległa, ale subariera nie musi być przyległa do siebie - mogą być rozproszone w całej pamięci Tablica najwyższego poziomu jest ciągła, ale zawiera tylko wskaźniki do podrysów, a nie same podbariery .

W obu przypadkach można uzyskać pojedynczy (wiersz)subarray z tablicy "2D", ale nie ma łatwego sposobu na uzyskanie tablicy kolumn - musisz utworzyć oddzielną tablicę i skopiować wartość z każdej pojedynczej tablicy wierszy, jeśli chcesz ją w tej formie.


-1 dla odpowiedzi № 5

1) Będę szczery, nie wiem.

2) Tak, powierzchnia przydzielona przez malloc jest ciągła w wirtualnej przestrzeni adresowej. Można to wydedukować prostą myśląćwiczenie; Gdy podasz wskaźnik, jeśli wykonasz iterację na całej przestrzeni, zawsze zwiększasz wskaźnik o jeden i nadal otrzymujesz prawidłowe dane. Zwróć jednak uwagę, że możliwe jest zwracanie nieciągłych odwzorowań fizycznych, mimo że jest to obsługiwane na poziomach poniżej (tj. W systemie operacyjnym i TLB procesora).

3) Zazwyczaj użyj sterty. Zasadniczo jest to większy segment, w szczególności jeśli używasz wątków (tj. test, który właśnie uruchomiłem pokazał pthreads "domyślny rozmiar stosu jako 8 MB).

Jeśli chodzi o drugą część 3), stos wywoływania funkcji jest taki sam jak stos zmiennych. Podczas tworzenia zmiennej statycznie (tj. Nie przez malloc), istnieje w ramce stosu funkcji, która oczywiście znajduje się na stosie.Aby uzyskać więcej informacji na ten temat, spójrz na konwencję stosu dla.