2013-03-04 5 views
1

약 300Bytes (5xint + 256chars)의 C 코드에 구조체가 있습니다.이 구조체의 모든 '개체'를 처리하기위한 배열의 좋은 메커니즘을 갖고 싶습니다. 배열의 전역 인덱스를 갖고 싶기 때문에 먼저 배열의 모든 인덱스가 NULL을 가리키고 있지만 필요하면 (malloc) 각 인덱스를 초기화하고 (무료) im을 삭제할 때 삭제합니다.구조체 C의 포인터 배열

typedef struct myfiles mf; 
mf* myArr[1000]; 

내가 찾고있는 게 맞습니까? 배열과 혼합 된 포인터는 종종 혼란 스럽습니다. 그래서, 단지 clerify하는 경우,

mf myArr[1000]; 

이미 내 첫 번째 제안은 1000pointers를 할당 스택에 1000 구조체를 할당합니까?

답변

3

정확합니다. Former는 1000 개의 포인터를 할당합니다. 어느 것도 초기화되지 않으며, 후자는 각각 ~ 300 바이트의 1000 개의 객체를 초기화합니다. foo_t* foo[1000] = {NULL};

을하지만 여전히 바보 :

는 null로 initalize합니다. 왜 mf* myArr = NULL가 아닌가? 이제 초기화 된 메모리에 대한 1000 개의 포인터와 추적 할 하나의 포인터 대신 초기화되지 않은 메모리에 대한 포인터가 하나 있습니다. 당신은 오히려 myArraySingle[300] 또는 * (에서 myArray [300]) '에 의해

myArraySingle = malloc(sizeof(mf)*1000); 또는

for(int i = 0; i < 1000; i++) { 
    myArray[i] = malloc(1000); 
} 

그리고 접근을 할 것인가? 어쨋든 내 요점은이 불필요한 간접 참조를 만들지 말고 문법이다. 배열 인덱스는 0

+0

감사합니다. 내 제안의 모든 포인터가 NULL이거나 메모리의 임의의 위치를 ​​가리키고 있다는 사실에 의존하는 것이 좋습니다. – buddy123

+0

모든 포인터를 보장하기 위해 배열에서 memset을 수행하는 것이 더 좋을 것입니다. NULL을 가리 킵니다. – Jay

+0

@ e-r-a-n 편집을 참조하십시오, 나는 C99를 생각하기 때문에 한 줄에이 작업을 수행 할 수 있습니다. – djechlin

1
typedef struct myfiles mf; 
mf* myArr[1000]; 

에서 시작하는 이유 포인터 지원 배열 스타일의 구문과이는 이유 하나의 포인터가 훨씬 배열과 같은 객체의 순서를 보유하고 메모리의 연속 된 덩어리를 가리 수있는 당신이 찾고있는. 이것은 구조체 mf에 1000 개의 포인터 배열을 할당합니다.

1

정확하게 이해하고있는 것 같습니다.

좀 더 정확히 말하자면, 모든 요소가 널 포인터로 초기화된다는 보증을 원하기 때문에 더 정확하게는 mf* myArr[1000] = { 0 };이 요구 사항을 충족시킬 것이라고 생각합니다. 초기화가 없다면 보증은 존재하지 않습니다.

C에 "전역"이 없습니다. 파일 범위에서 선언 된 정적 저장 기간을 가진 개체를 말합니다.

0
typedef struct myfiles mf; 
mf* myArr[1000]; 

예, 1000 포인터를 초기화합니다. 사용하기 전에 malloc/calloc을 사용하여 각 포인터에 메모리를 할당해야합니다.