2009-11-02 3 views
1

C에서 표준 스택을 작성하려고했지만 제 stk_size() 함수가 제 32 비트 PC를 제외한 다른 플랫폼에서 작동 할 수 있는지 확실하지 않습니다. 나는 int에 대한 포인터를 던지는 것이 좋지 않다는 것을 읽었다. 하지만 더 나은 구현 방법은 무엇입니까? 나는 "크기"변수를 추가하고 싶지 않다. 내 눈이 과다하기 때문이다. 여기C - 스택에 요소를 가져 오는 int에 대한 포인터

는 소스의 일부입니다 :

#define MAX_STACK_SIZE 100 

    typedef struct stk stack; 

    struct stk 
    { 
      /* Stack */ 
      int * stk; 

      /* Pointer to first free element of stack */ 
      int * sp; 
    }; 

    void stk_init(stack* s) 
    { 
      /* Allocate memory for stack */ 
      s->stk   = malloc(sizeof(s->stk) * MAX_STACK_SIZE); 

      /* Set stack pointer to first free element of stack -> 0 */ 
      s->sp   = s->stk; 
    } 

    int stk_size(stack* s) 
    { 
      return ((int) s->sp - (int) s->stk)/sizeof(int *); 
    } 

    int main(int argc, char * argv[]) 
    { 
      stack * s; 
      stk_init(s); 
    } 

감사합니다!

+0

당신이 캐스팅해야하는 경우, 왜 뺄셈 후 (필요한 경우) 캐스팅하지? –

답변

9

(s->sp - s->stk) 만 사용할 수 있습니다. 포인터를 빼면 부호가있는 정수 유형인 ptrdiff_t가 생성됩니다.

0

두 포인터를 int로 변환하지 마십시오. 포인터를 빼서 결과를 int, unsigned int로 캐스트하십시오 (s-> sp가 항상> = s-> stk 인 경우). 이렇게하면 sizeof (int *)로 나눌 필요가 없습니다.

0

표준 정의 형식 인 intptr_tint 또는 모든 포인터 유형을 저장할 수있을만큼 충분히 큰 것이 보증됩니다. 그것을 사용하십시오.

예를 들어, int이 32 비트이지만 포인터가 64 비트 인 플랫폼에있는 경우 intptr_t은 64 비트 유형입니다.

5

처음에는 버그가 있습니다. stack 개체에 공간을 할당하지 않았습니다. 당신이 원하는 하나

int main(int argc, char * argv[]) 
{ 
     stack s; 
     stk_init(&s); 
} 

또는

int main(int argc, char * argv[]) 
{ 
     stack * s = malloc(sizeof(stack)); 
     stk_init(s); 
} 

그리고 귀하의 질문에 관해서는, 나는이 입력 한 동안 @Crashworks 이미 응답 한 참조

. stkint * 때문에

+0

... 또는's = stk_init()' – caf

+0

@caf stk_init가 스택을 할당하고 반환하기 전에 다시 작성되지 않으면 도움이되지 않습니다. 아마 그것이 당신이 제안하는 것입니다. – Grumdrig

+0

글쎄, 네 - 첫 번째 제안을 위해'stk_init'을 바꿔야 할 필요가 있습니다. – caf

1

캐스트 필요가 없습니다, 그리고 stk_init에서 ints

size_t stk_size(stack* s) 
{ 
     return (s->sp - s->stk); 
} 
2

에 너무 오래 당신이 당신의 대답을 원하는대로 나눌 필요가 없습니다 당신은

s->stk = malloc(sizeof(int) * MAX_STACK_SIZE); 

를 사용한다. 즉 스택은 int으로 구성됩니다.

stk_size에서이 작업을 수행해야한다 : 당신이 C에서 포인터를 뺄 때

return s->sp - s->stk; 

는, C는 고려가 가리키는 객체의 크기를합니다 (이 경우에 int이다).

그것은 바보 같은 생각,하지만 당신이 정말로 원한다면, 당신은 이런 식으로 할 것 : ((int) s->sp - (int) s->stk)/sizeof(int);

+0

을 의미합니다. malloc (MAX_STACK_SIZE * sizeof * s-> stk). – caf

+0

그래, 나는 그것을 읽는 것이 더 힘들다는 것을 알지만. IMO는 typedef가 더 좋을 것입니다. – Artelius