2011-07-26 4 views

답변

3

무료()만이 알고있는 깊은 비밀입니다. 그것은 당신의 시스템에 있을지도 모르지만, 완전히 구현에 의존적 인 방식입니다.

A는 어색 비트,하지만 당신은 모든 것을 함께 유지하려는 경우 :

typedef struct 
{ // size of data followed by data (C only trick! NOT for C++) 
    int  dimension; // number of data elements 
    int  data[1];  // variable number of data elements 
} malloc_int_t; 

malloc_int_t *ab; 

int dimension = 10; 
ab = malloc(sizeof(*ab) + (dimension-1)*sizeof(int)); 
ab->dimension = dimension; 

ab->data[n] // data access

을 나는 코드보다 일반적인 템플릿 만들기 위해 INT에 데이터 형식을 변경했습니다.

+0

무료()가 반드시 알 필요는 없습니다. malloc (10)은 실제로 16 바이트를 할당 할 수 있습니다. free()는 요청 된 10 바이트가 아니라 실제로 할당 된 16 바이트 만 알아야합니다. –

+0

예 ... 나는 "구현 특정"부분을 고려합니다. – Gilbert

0

크기는 malloc으로 전달 된 것이므로이를 기억하기 위해 전역 변수 나 매크로를 사용할 수 있습니다.

1

아니요, 불행히도.

블록 크기를 포인터와 함께 전달해야합니다.

1

할당 된 메모리의 크기를 다른 변수에 저장해야합니다.

2

당신은 (어쨌든 이동 가능) 할 수 없습니다. 너는 너 자신의 크기를 추적해야한다.

malloc의 일부 구현은 해당 정보에 액세스하기위한 API를 제공 할 수 있지만이 표준에 대한 규정은 없습니다.

7

아니요, 표준 방법이 없습니다. pointer와 함께 pointed-to-memory의 크기를 넘겨야 만합니다. 일반적인 해결책입니다.

e.e. 대신

void f(char* x) 
{ 
    //... 
} 

사용

void f(char *x, size_t length) 
{ 
    //.... 
} 

의 및 코드

char *ab = malloc(10); 
f(ab, 10); 
+4

함수 프로토 타입이'void f (char * x, size_t length)'일 것을 제안합니다. 'size_t'는 전달되는 값의 타입을 더 잘 나타내고 또한'malloc'에 대한 인자의 타입과 일치합니다. –

0

에 포인터 자체에서 할당 된 메모리의 크기를 추론 할 수있는 방법은 없습니다. abchar *이므로 sizeof(ab)은 할당 된 메모리 덩어리의 크기와 분명하지 않은 sizeof(char *)과 같습니다.

malloc을 필요한 크기로 호출 했으므로 크기가 무엇인지 알 것입니다. 이 숫자를 포인터를 크기를 알아야하는 함수에 전달하십시오.

1

번호

이제 말했다되는 것으로,이 작업을 수행하는 비 휴대용 해킹이 있습니다,하지만 그들에게 의존하는 안전하지 않습니다.

메모리가 malloc()을 통해 할당되었다는 것을 100 % 확실하게 알고 있다면 포인터를 몇 바이트 되감기하고 메모리의 어느 부분이 있었는지 추적하는 데 사용되는 'malloc 노드'를 검사 할 수 있습니다 할당되어 있지 않다. 그러나, 나는 이것을 충분히 강조 할 수는 없으며, 이것에 의존하지 마십시오.

0

구조와 메모리 포인터를 가리키는 char 포인터가 있습니다. 그래서 귀하의 질문에 관련, 나는 그것이 가리키는 메모리 위치의 크기, 즉 구조의 크기를 찾고 싶었어요. 그래서 논리적으로 당신이하는 일은 포인터가 생성하는 객체의 크기를 찾는 것입니다. 이것은 나를 위해 일했다 :

unsigned char * buffer= Library1Structure; 
int x=sizeof(Library1Structure); 

그래서 x의 값은 포인터 버퍼가 가리키는 메모리 위치의 크기를 알려준다.

+0

다른 함수에서 "Library1Structure"에 대한 액세스 권한이없는 뾰족한 메모리의 크기를 알아야합니다 –

+0

헤더 파일에서 library1 구조를 선언하십시오 ... –

관련 문제