은 내가 쓴 : 포인터가 가리키는 메모리의 크기를 계산하는 방법은 무엇입니까? 하나의 함수에서
char *ab;
ab=malloc(10);
그런 다음 다른 함수에 나는
ab
포인터가 가리키는 메모리의 크기를 알고 싶어요.
ab
이 10 문자의 메모리를 가리키고 있다는 것을 알 수있는 방법이 있습니까?
은 내가 쓴 : 포인터가 가리키는 메모리의 크기를 계산하는 방법은 무엇입니까? 하나의 함수에서
char *ab;
ab=malloc(10);
그런 다음 다른 함수에 나는
ab
포인터가 가리키는 메모리의 크기를 알고 싶어요.
ab
이 10 문자의 메모리를 가리키고 있다는 것을 알 수있는 방법이 있습니까?
무료()만이 알고있는 깊은 비밀입니다. 그것은 당신의 시스템에 있을지도 모르지만, 완전히 구현에 의존적 인 방식입니다.
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에 데이터 형식을 변경했습니다.
크기는 malloc
으로 전달 된 것이므로이를 기억하기 위해 전역 변수 나 매크로를 사용할 수 있습니다.
아니요, 불행히도.
블록 크기를 포인터와 함께 전달해야합니다.
할당 된 메모리의 크기를 다른 변수에 저장해야합니다.
당신은 (어쨌든 이동 가능) 할 수 없습니다. 너는 너 자신의 크기를 추적해야한다.
malloc
의 일부 구현은 해당 정보에 액세스하기위한 API를 제공 할 수 있지만이 표준에 대한 규정은 없습니다.
아니요, 표준 방법이 없습니다. pointer와 함께 pointed-to-memory의 크기를 넘겨야 만합니다. 일반적인 해결책입니다.
e.e. 대신
void f(char* x)
{
//...
}
사용
void f(char *x, size_t length)
{
//....
}
의 및 코드
char *ab = malloc(10);
f(ab, 10);
함수 프로토 타입이'void f (char * x, size_t length)'일 것을 제안합니다. 'size_t'는 전달되는 값의 타입을 더 잘 나타내고 또한'malloc'에 대한 인자의 타입과 일치합니다. –
에 포인터 자체에서 할당 된 메모리의 크기를 추론 할 수있는 방법은 없습니다. ab
이 char *
이므로 sizeof(ab)
은 할당 된 메모리 덩어리의 크기와 분명하지 않은 sizeof(char *)
과 같습니다.
malloc
을 필요한 크기로 호출 했으므로 크기가 무엇인지 알 것입니다. 이 숫자를 포인터를 크기를 알아야하는 함수에 전달하십시오.
번호
이제 말했다되는 것으로,이 작업을 수행하는 비 휴대용 해킹이 있습니다,하지만 그들에게 의존하는 안전하지 않습니다.메모리가 malloc()을 통해 할당되었다는 것을 100 % 확실하게 알고 있다면 포인터를 몇 바이트 되감기하고 메모리의 어느 부분이 있었는지 추적하는 데 사용되는 'malloc 노드'를 검사 할 수 있습니다 할당되어 있지 않다. 그러나, 나는 이것을 충분히 강조 할 수는 없으며, 이것에 의존하지 마십시오.
구조와 메모리 포인터를 가리키는 char 포인터가 있습니다. 그래서 귀하의 질문에 관련, 나는 그것이 가리키는 메모리 위치의 크기, 즉 구조의 크기를 찾고 싶었어요. 그래서 논리적으로 당신이하는 일은 포인터가 생성하는 객체의 크기를 찾는 것입니다. 이것은 나를 위해 일했다 :
unsigned char * buffer= Library1Structure;
int x=sizeof(Library1Structure);
그래서 x의 값은 포인터 버퍼가 가리키는 메모리 위치의 크기를 알려준다.
다른 함수에서 "Library1Structure"에 대한 액세스 권한이없는 뾰족한 메모리의 크기를 알아야합니다 –
헤더 파일에서 library1 구조를 선언하십시오 ... –
무료()가 반드시 알 필요는 없습니다. malloc (10)은 실제로 16 바이트를 할당 할 수 있습니다. free()는 요청 된 10 바이트가 아니라 실제로 할당 된 16 바이트 만 알아야합니다. –
예 ... 나는 "구현 특정"부분을 고려합니다. – Gilbert