0

malloc()에 메모리 할당에 대한 질문이 있습니다. int 값이 k입니다. (2*k-1)-k+1) == k 것을 알고 다음과 같은 방법C - sum을 계산하고 malloc()의 sizeof로 곱하십시오.

...=(int*)malloc(k*sizeof(int)); 

...=(int*)malloc(((2*k-1)-k+1)*sizeof(int)); 

에 할당의 차이점은 무엇입니까?

((2*k-1)-k+1) == k가 변경 될 수 있다고해도 두 결과 모두 동일하거나 두 번째 경우가 있습니까?

+0

[malloc()의 반환 값과 'C'의 패밀리를 형 변환하지 않는 이유에 대한이 토론을 참조하십시오.] (http://stackoverflow.com/q/605845/2173917). –

답변

0

우선, please see this discussion on why not to cast the return value of malloc() and family in C..

즉, malloc()은 할당 할 메모리의 바이트 수를 인수로 사용합니다.

인용 C11 챕터 §7.22.3.4, malloc() 함수

void *malloc(size_t size);

malloc 함수는 크기가 size 의해 지정된 객체에 대한 공간을 할당 [...]

따라서 xy가 액세스 할 수 있도록 당신에게 메모리를 같은 양으로 포인터를 제공합니다 같은 값으로

malloc(x * sizeof(sometype)) 

malloc(y * sizeof(sometype)) 

을 평가 호출 성공입니다 제공.

마지막으로 항상 sizeof 연산자에 하드 코딩 된 값을 사용하지 않는 것이 좋습니다. 대신 변수 자체를 사용하십시오. k 수학적으로 등가이지만

int *p = NULL; 
    . 
    . 
    . 
    p = malloc (x * sizeof(*p)); // type of `p` can change, 
           // this statement need not be changed 
+0

하드 코딩 된 값을 사용하면 경우에 따라 세분화 오류가 발생할 수 있습니다? – D3m

+0

'malloc()'의 성공 여부를 확인하지 못한 경우에만 @ D3m. –

0

, (2*k-1)-k+1는 정의되지 않은 동작 결과 오버플있다 제품과 같은 코드를 더 강력하게. int 범위의 절반과 k의 차이.

... = malloc(((2*k-1)-k+1)*sizeof(int)) 

k*sizeof(int) 제품 자체가 오버 플로우되지만 바람직하지 않은 경우에도 제품이 잘 정의되어 있습니다.

size_tint의 범위에 따라 오버 플로우가 발생할 수 있습니다. size_t은 일반적으로 int의 양수 범위의 두 배이며 아마도 몇 배 이상입니다. 드물게 그만큼 적습니다. 추천 :

int *p = malloc(sizeof *p * k); 

주 : malloc()의 결과를 주조

  1. 이 필요하지 않습니다.
  2. 이 아닌 sizeof *p을 사용하면 잘못 코딩 할 가능성이 줄어들고 검토 및 유지 관리가 쉬워집니다.
  3. sizeof *p을 갖는 것은 먼저 적어도 size_t 수학을 사용하여 다음 수학 식 중 많은 부분을 보장합니다.