2009-12-21 7 views
0

typedef struct { struct 테이블 ** 기호; // 스택의 배열 int top; // 맨 위 요소의 인덱스 int 크기; // 최대 스택 크기 } 스택;포인터 배열 배열

void *createStack(int size) 
{ 
    stack *stck; 
    stck = (stack *) malloc(sizeof(stack)); 

    stck->symbols = .... 

    stck->size = size; 
    stck->top = -1; 
    printf("stack is created --> size is : %d \n",size); 
} 

여기에 나는 "..."내 스택의 기호 배열을 할당해야하지만, 나는 그것의 구문을 알아낼 수, PLS 도움 :)

+4

'malloc'이 성공했는지 확인하는 것을 잊지 마십시오! – JaakkoK

+0

컴파일시 정확한 크기를 알고 있으면 malloc을 사용하지 마십시오. 배열의 크기는 어느 정도입니까? –

답변

3
(struct table **)malloc(size * sizeof(struct table*)); 

을하지만 그 경우입니다 모든 공간을 한 번에 사전 할당하려고합니다. 더 많은 것을 할당하려면, size보다 작은 것으로 시작하여 공간이 부족할 때 push() 함수에서 더 많은 것을 할당 할 수 있습니다.

4
malloc(size * sizeof(struct table*)); 
+0

캐스트를 포함시킬 수 있습니다. – Skurmedel

+2

C에서의 명시 적 형변환은 필요하지 않습니다. –

+0

내 잘못 :) ... 그때는 분명히 좋아하는 나야. – Skurmedel

1

심볼은 구조체 테이블에 대한 포인터의 1 차원 배열 또는 구조체 테이블의 2 차원 배열을 의미합니까?

stck->symbols = malloc(sizeof *(stck->symbols) * numberOfElements); 

numberOfElements의 값이 무엇이든간에. stck-> 기호의 유형이 struct table ** 인 경우 *(stck->symbols) 표현의 유형은 struct table *이됩니다.

malloc(sizeof (struct table*) * numberOfElements); 

을 쓸 수도 있지만 이전 방법을 선호합니다. 유형을 기억해야하는 장소의 수를 최소화합니다.

여기가 C이므로, 이 아니고은 결과를 malloc()으로 캐스팅해야합니다. 그렇게하는 것은 좋지 않습니다. stdlib.h를 포함하는 것을 잊었거나 범위에 malloc()의 프로토 타입이없는 경우 캐스트는 C99에서 더 이상 암시 적 int 유형을 허용하지 않으므로 더 이상 문제가되지 않을 수도 있음을 경고하는 경고를 표시합니다).

0
stck->symbols = baseaddress = malloc(...required total size...); 

int nextDataLocation = baseAddress + numberOfRows*sizeof(void*); 

for(int i=0; i<numberOfLines; i++) 
{ 
    stck->symbols[i] = nextDataLocation; 
    ..copy string i to address stck->symbols[i]... 
    nextDataLocation += lengthOfString[i]; 
}