2010-07-22 2 views
1

나는 c 프로그램을 만들려고하고 있는데, 나는 malloc 명령에 빠져있다. 이건 내 코드입니다 : 그것은 있어야 할 곳에malloc은 4 비트 만 할당합니까?

 #include <stdlib.h> 
     #include <iostream> 
     #include "Oef1.h" 
     using namespace std; 

some methode clled by main{ 
     int ** q=NULL; 
     int m=read(q); 
} 


int read(int ** q){ 
      int m=3; 
      int n=5; //n and m are beeing asked, but for debugging hard-coded 
      cout << sizeof(int*) << endl;  // returns 4 
      cout <<sizeof(q) << endl;  //returns 4 
      cout <<m*sizeof(int*) << endl; //returns 12 
      q=(int**)realloc(q,m*sizeof(int*)); 
      cout <<sizeof(q) << endl;   //should return 12 but returns 4 
      for(int k =0; k < m; k++){ 
      q[k] = (int*)malloc(n*sizeof(int)); 
      } 
      return m; 
    } 

문제는 malloc을 한 후에는 sizeof (Q)를 명령 있다는 것입니다 여전히 4 12 (3 * 4). 나는 당신이 배열을 C++로 만들 수 있다는 것을 안다. 그러나 나는 목적을 위해 malloc을 사용한다. 그것은 아마 어리석은 실수 일 테지만 나는 그것을 찾지 못한다.

+3

당신은 할 수 있습니다 비트와 바이트의 차이점에 익숙해지면 프로그래머로서의 삶이 훨씬 쉬워 질 것입니다 .... – SoapBox

+0

read() 함수에서 realloc을 사용하는 방식은 잘못되었습니다. 실제로는 위의 코드는 "maine에 의해 clled 된 일부 메소드"에서 q를 사용하지 않기 때문에, realloc은 메모리를 새로운 위치로 이동시키고 반환하는 옵션을 가지고 있습니다. 당신은 q를 읽기에 올바르게 할당하지만 q는 전달되기 때문에 값에 따라, "main 메소드에 의해 clled 된 일부 메소드"가 reallo 후에 q를 사용하는 경우 C는 메모리 블록 (q는 처음에는 NULL이기 때문에)을 이동하기로 결정했습니다. q를 사용하려고 시도하는 "일부 메서드는 기본으로 클리핑됩니다"의 어떤 것이라도 원하는 작업을 수행하지 않습니다. – George

답변

11

sizeof은 포인터 인 데이터 유형의 크기를 반환합니다. 시스템에서 포인터는 항상 4 바이트 (비트가 아니며이 아님)입니다. sizeof은 포인터에 사용될 때 배열의 크기를 반환하지 않습니다.

+0

아래로 투표 했나요? –

+1

실제로'sizeof' * 배열이 주어지면 배열의 크기를 반환합니다. – Rotsor

+0

예, 죄송합니다. 맞습니다. 나는 배열이 지적했다. 정수 문자열과 같은 배열에서 당연히 sizeof를 수행하면 배열의 크기를 알 수 있습니다. 마찬가지로 실제 구조체를 제공하면 구조체의 크기를 반환합니다. –

2

sizeof (q)는 포인터가 가리키는 내용이 아니라 포인터 q의 크기를 반환합니다.

3

sizeof (Any_Type)는 메모리에서 차지하는 크기를이 유형의 한 요소만큼 반환합니다. sizeof (q)는 sizeof (int **)입니다. 포인터의 크기입니다 (일반적으로 32 또는 64 비트 시스템에 있는지에 따라 4 또는 8).

또한 비트와 바이트를 혼동스럽게합니다. sizeof는 크기가 아닌 바이트 단위로 크기를 반환합니다.

1

sizeof(q)은 q의 데이터 유형 크기를 알려줍니다.이 경우 int**입니다. 컴파일 시간이 일 때 으로 평가 되었기 때문에 그렇지 않다면 sizeof은 동적으로 할당 된 객체/배열의 크기를 알려주지 않습니다. 동일한 x에 대해 sizeof(x)이 다른 값을 반환하는 것은 불가능합니다. 형식의 크기는 컴파일 타임 상수입니다.

할당 (당신이 등 malloc()/new에 전달 된 값의 크기를 추적, 또는 오히려 (당신을 위해 std::vector을 그렇게 할 것입니다 표준 컨테이너)를 사용하는 사용자의 작업입니다.

관련 문제