2011-12-18 5 views
-1

정적 배열을 수행 한 것처럼 동일한 배열을 참조 할 수 있도록 구조체 배열을 C로 동적으로 할당하려고합니다. 나는 calloc()이 할당 된 모든 메모리를 0으로 초기화하는 추가 단계를 수행한다는 것을 이해한다. 그러나 그 외의 코드는 다음 코드와 완전히 바꿔 쓸 수 있는가? fread()와 fwrite()를 사용하여 파일 내부 및 외부에서 이러한 데이터 구조를 가져 오는 경우 calloc()이 도움이되거나 방해가됩니까?calloc, malloc 및 동적 구조체 할당

#define MAGIC 13 
    struct s_myStruct { 
int a[6000][400]; 
int b[6000][400]; 
int c[6000][400]; 
}; 

struct s_myStruct stuff[MAGIC]; 
vs 
struct s_myStruct *stuff = calloc(MAGIC, sizeof(s_myStruct); 

감사합니다.

+1

파일과 어떤 관련이 있습니까? – Joe

+1

또한 배열에 "universal zero initializer"를 사용할 수 있습니다 :'struct s_myStruct stuff [MAGIC] = {0};' – pmg

답변

1

그들은 동일하지 않습니다. 이 같은 데이터를 선언 :이 기능 범위에 선언하는 경우

struct s_myStruct stuff[MAGIC]; 

가 초기화되지 않은 메모리를 떠나 (당신이해야하는, 두 번째 선택을 제공). 세미콜론 앞에 = {0}을 추가하면이를 수정합니다.

두 번째로 calloc을 사용하면 힙에 메모리가 할당됩니다.

항상 차이점이 있습니다. sizeof(stuff)은 첫 번째 경우에는 13 * sizeof (struct s_myStruct)가되고 두 ​​번째 경우에는 포인터의 크기가됩니다.

+0

당신은 2 가지 경우가 완전히 다르다는 것을 말하고 있습니까? 그리고 두 번째 경우는 제가 구조체에 대한 포인터를위한 저장소를 할당하는 것이지 구조체 자체에 대한 포인터를 할당하지 않는 것입니까? 따라서 구조체에 저장소를 할당하기위한 또 다른 단계가 필요합니까? – PaeneInsula

+0

아니, 그들은 거의 동일합니다 - 나는 단지 몇 가지 차이점을 열거했습니다. –

+0

확인. 당신의 도움을 주셔서 감사합니다. – PaeneInsula

0

스택에 13 * 3 * 6000 * 400 * 4 = 370MB를 넣으므로 실제로 첫 번째 작업을 수행하고 싶지는 않습니다.

그러나 이것은 freadfwrite을 사용하는 것과 관련이 없습니다.

+0

스택에 [MAGIC]을 넣을 의도가 아니 었습니다. 그것은 글로벌입니다. – PaeneInsula

+0

@ user994179 :이 경우, 어떤 점에서 동적 버전을 '해제'해야한다는 것 외에도 실습에 약간의 차이가 있습니다. 또한 @Paul이 그의 대답에서 언급했듯이 배열과 포인터에는 동작에 약간의 차이가 있습니다. –

+0

여기 내 무례 함을 용서해주십시오. 그러나 Paul이 말했듯이, 구조체 자체보다는 구조체에 대한 포인터를위한 저장소 만 할당한다면, 제시 한 2 가지 경우 (정적 대 동적)는 완전히 다르며 뭔가해야합니다 동적 인 경로를 사용하고 싶다면? – PaeneInsula