2013-08-30 7 views
3

이렇게 많이 게시 되었기 때문에 게시하는 것이 싫지만 그 중 아무 것도 내가 보는 것을 처리하지 못하는 것 같습니다. 정상적인 문제 (선언되지 않은 함수, 의도하지 않은 캐스트, 기본 포인터의 오해)는 여기에 적용되지 않습니다. 이것은 내 코드의 버려진 버전입니다.포인터에 포인터를 할당 할 때 경고 메시지가 나타납니다. 할당은 포인터에서 정수를 만듭니다.

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 

extern void* malloc (size_t size); 

typedef struct { 
    size_t  size; 
    uint8_t* buffer, curr, next; 
} buffer_t; 

void init(buffer_t* b, int size) { 
    b->size = (size_t) size; 
    b->buffer = (uint8_t*) malloc(sizeof(uint8_t) * b->size + 1); 
    b->curr = (uint8_t*) b->buffer; // warning: assignment makes integer from pointer without a cast [enabled by default] 
    b->next = (uint8_t*) b->buffer; // warning: assignment makes integer from pointer without a cast [enabled by default] 
} 

int main (int argc, char* argv[]) { 
    buffer_t buf; 

    init(&buf, 16); 

    return 0; 
} 

이것은 캐스트가 없어도 실패하지만, 더 명확하게 나타납니다.

저는 MinGW/MSYS에서 gcc 4.7.2로 WinXP (예, 예, 예)로 컴파일하고 있습니다. 다음 명령을 사용하십시오 :

gcc -std=c99 -Wall -o testing test.c 

어떤 도움이 필요합니까?

+1

'malloc'은 ''에 선언되어 있습니다. 왜 그걸 너 혼자 선언하니? (그건 당신의 문제와 관련이 없습니다.) –

+0

또한 [당신은'malloc'에서 리턴 값을 던지면 안됩니다.] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of -malloc),'b-> buffer'를 이미'uint8_t *'로 캐스팅 할 필요가 없습니다. –

답변

10
uint8_t* buffer, curr, next; 

당신이 그것을 쓴 방법, buffer는 포인터와 currnext 단순한 uint8_t들입니다입니다. 당신은 아마 의미 :

uint8_t *buffer, *curr, *next; 

더 나은 (덜 오류 경향이) 한 줄에 각 필드를 가지고하는 것입니다.

+0

감사합니다. 내가 느끼는 그 정신적 괴로움은 뇌를 떠나는 어리 석음입니다. – user2734029

+1

@ user2734029 걱정할 필요가 없습니다. 모든 사람들은 때때로이 실수를 저지른다 : 경고를 가능케하는 소품. – cnicutar

1

구조체 선언 내에서 curr 및 next를 uint8_t (uint8_t에 대한 포인터가 아닙니다)로 선언했습니다. 대신이 방법을 사용해보세요. uint8_t * buffer, * curr, * next;

0

이것은 좋은 질문입니다. 스토리지

void init(buffer_t* b, int size) { 
    b->size = (size_t) size; 
    b->buffer = (uint8_t*) malloc(sizeof(uint8_t) * b->size + 1); 
    b->curr = b;  // a self-pointer to this buffer_t 
    b->next = NULL; // pointer to next buffer_t structure 
} 

b->buffer 포인트 : 다음 액면 당신의 구조를 수락하고 CURR를 가정하고하는 것은 동일한 구조의 다른 발생에 대한 포인터를 (것 또한 다른 답변에 따라 코드 수정이 필요)해야한다, 다음 init는 다음과 같이 코딩한다 힙에 할당 된 반면, buffer_t 구조는 많은 다른 버퍼를 관리하는 데 사용되는 연결된 목록의 일부입니다.

관련 문제