2014-04-27 2 views
0

내가 함수로 매트릭스의 생성을 포장하려고하지만이 책에서 추출한 다음 코드 이해하려고 노력하는 데 문제가있는 sizeof 연산자의 사용 : 나는했습니다malloc에 ​​

// An error checked malloc() wrapper function 
    void *ec_malloc(unsigned int size) { 
    void *ptr; 
    ptr = malloc(size); 
    if(ptr == NULL) 
     fatal("in ec_malloc() on memory allocation"); 
    return ptr; 
    } 

을 이미이 질문을 확인 :

Do I cast the result of malloc?

을 그리고 지금은 지금은 결과를 캐스팅 할 필요가 없습니다. 하지만 내가 이해할 수없는 것은 연산자가없는 malloc(size)의 사용입니다.

// An error checked malloc() wrapper function 
    void **double_ec_malloc(unsigned int size) { 
    void **ptr; 
    ptr = malloc(size); 
    if(ptr == NULL) 
     fatal("in ec_malloc() on memory allocation"); 
    return ptr; 
    } 

그리고 내가 할 :

int **matrixA = double_ec_malloc(size); 

    int i = 0; 
    for (i = 0; i < size; i++){ 
    matrixA[i] = ec_malloc(size); 
malloc

man는 말한다 :

예를 들어, 매트릭스를 생성, 나는 또한이 기능을 만든 int **matrix을 말할 수 malloc() 함수는 size 바이트를 할당하고 할당 된 메모리에 대한 포인터를 반환합니다.

하자가 ptr = malloc(size)에 내가 4 바이트를 할당하고 다음 4size하지만, 매트릭스 형 int 인 경우. sizeof int * 4이 필요하지 않습니까? 왜냐하면 지금은 정수 배열에 충분한 메모리를 할당하지 않을 것이라고 생각하기 때문입니다.

+0

이것은 의미가 없습니다. 왜 당신은'void **'를'malloc() '래퍼에서 돌려 주겠습니까? 'sizeof'는 무엇이 문제입니까? ** ** ** ** ** ** ** ** ** ** 당신이 그것을 정확하게 사용해야만한다는 것을 알고 있다면, 왜 그것을 사용하지 않습니까? –

+2

그 책은 그것으로 가득 차 있습니다. 'malloc()'은 적어도 요즘에는'int'가 아닌'size_t' 인수를 기대합니다. – EOF

답변

1

ec_malloc()은 데이터 형식 인수를 사용하지 않으므로 sizeof(datatype) * size 자신을 사용한다고 가정합니다. 따라서 인수 unsigned int size은 바이트 단위 여야합니다.

정확히 어떻게 malloc() 자체가 동작하는지주의하십시오.

+0

야, 정말 고마워!, 내가 포인터를 다시 이해하는 데 어려움을 겪고 있다고 C에서 프로그래밍하지 않았으므로 꽤 오랜 시간이 걸렸다. 당신의 대답은 내가'ec_malloc'을 잘못 사용하고 있다는 것을 깨닫게했습니다. 나는 이것을'ec_malloc (sizeof (int) * tam)'이라고 부를 필요가있다. 나는이 질문에 대해 지금 바보 같은 기분이 들었다. – elbaulp

0

malloc 함수 (및 사용자의 ec_malloc)는 모두 size 바이트 길이의 선형 영역을 할당합니다.

sizeof 단순히 int 반환 그것은 어떤 식 으로든 (이 자주 malloc와 함께 사용 이외)에 malloc 관련이 없습니다.

32 비트 정수는 4 바이트입니다. sizeof(int)은 4를 반환합니다. 4 int에 대한 공간을 원하면 malloc(sizeof(int) * 4)이라고 말합니다.