Ponieważ rozmiar deklarowanej macierzy nie jest stały, macie Państwo tablicę zmiennych o zmiennej długości (VLA) . VLA są dozwolone przez standard c99, ale wiążą się z nim pewne ograniczenia. Nie można mieć tablicy o zmiennej długości ze specyfikatorem klasy pamięci masowej static
lub extern
.
Masz umowę VLA ze specyfikacją przechowywania static
i nie jest to dozwolone przez standard C99.
odniesienia:
C99 standardowy: 6.7.5.2/8
Przykład 4 wszystkie deklaracji różnie modyfikowany fi ed (VM) typu muszą być w każdym zakresie bloku lub prototypowej funkcji zakresu. Obiekty tablicy zadeklarowane w specyfikacji statycznej lub zewnętrznej klasy pamięci nie mogą mieć tablicy o zmiennej długości (VLA) typu. Jednak obiekt zadeklarowany ze statyczną specyfikacją klasy pamięci może mieć typ maszyny wirtualnej (czyli wskaźnik do typu VLA). Wreszcie, wszystkie identyfikatory zadeklarowane za pomocą typu VM muszą być zwykłymi identyfikatorami i dlatego nie mogą być członkami struktur lub związków.
Jeśli chcesz mieć tablicę o wymiarach dynamicznych ze specyfikatorem pamięci static
, musisz użyć tablicy dynamicznej przydzielonej do sterty.
#define MAX_SIZE 256
static int* gArr;
gArr = malloc(MAX_SIZE * sizeof(int));
EDIT:
Aby odpowiedzieć zaktualizowaną pytanie:
Po usunięciu słowa kluczowego static
od zgłoszenia, specifier przechowywanie deklarowanych zmian tablicę z static
globalne, należy zwrócić uwagę na standardowe cytat powyżej, wyraźnie wspomina o ograniczeniu, że umowy VLA są niedozwolone przy przechowywaniu specyfikacji static
i extern
. Oczywiście, możesz mieć VLA z globalną specyfikacją pamięci, która jest po usunięciu słowa kluczowego static
.
Dzięki za dobrze zbadaną odpowiedź. – Abhinav
Tak skutecznie, jeśli używam gcc-4.3, VLA nie są dozwolone dla zmiennych typu zewnętrznego i statycznego? Oto, co odpowiedział również DCoder użytkownika w komentarzu w innej odpowiedzi. – Abhinav
@Abhinav: Tak, masz rację. Warianty VLA są niedozwolone dla zmiennych ze specyfikacją przechowywania typu "zewnętrznego" i "statycznego". Używasz gcc-4.3, który jest kompatybilny ze standardem c99. Zmieniono odpowiedź na adres edytowanego zapytania. –