Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서는 malloc()에 대한 캐스트가 필요하지만 C는 그렇지 않은 이유는 무엇입니까?

<시간/>

C 언어에서 void 포인터는 암시적으로 개체 포인터 유형으로 변환됩니다. malloc() 함수는 C89 표준에서 void *를 반환합니다. 이전 버전의 C에서 malloc()은 char *를 반환합니다. C++ 언어에서 기본적으로 malloc()은 int 값을 반환합니다. 따라서 포인터는 명시적 캐스팅을 사용하여 개체 포인터로 변환됩니다.

다음은 C 언어에서 메모리를 할당하는 구문입니다.

pointer_name = malloc(size);

여기,

pointer_name − 포인터에 부여된 모든 이름.

크기 − 할당된 메모리의 크기(바이트)입니다.

다음은 C 언어의 malloc() 예제입니다.

예시

#include <stdio.h>
#include <stdlib.h>
int main() {
   int n = 4, i, *p, s = 0;
   p = malloc(n * sizeof(int));
   if(p == NULL) {
      printf("\nError! memory not allocated.");
      exit(0);
   }
   printf("\nEnter elements of array : ");
   for(i = 0; i < n; ++i) {
      scanf("%d", p + i);
      s += *(p + i);
   }
   printf("\nSum : %d", s);
   return 0;
}

출력

Enter elements of array : 2 28 12 32
Sum : 74

위의 C 언어 예제에서 명시적 캐스팅을 수행하면 오류가 표시되지 않습니다.

다음은 C++ 언어에서 메모리를 할당하는 구문입니다.

pointer_name = (cast-type*) malloc(size);

여기,

pointer_name − 포인터에 부여된 모든 이름.

캐스트 유형 − malloc()에 의해 할당된 메모리를 캐스팅하려는 데이터 유형.

크기 − 할당된 메모리의 크기(바이트)입니다.

다음은 C++ 언어의 malloc() 예제입니다.

예시

#include <iostream>
using namespace std;
int main() {
   int n = 4, i, *p, s = 0;
   p = (int *)malloc(n * sizeof(int));
   if(p == NULL) {
      cout << "\nError! memory not allocated.";
      exit(0);
   }
   cout << "\nEnter elements of array : ";
   for(i = 0; i < n; ++i) {
      cin >> (p + i);
      s += *(p + i);
   }
   cout << "\nSum : ", s;
   return 0;
}

출력

Enter elements of array : 28 65 3 8
Sum : 104

위의 C++ 언어 예제에서 명시적 캐스팅을 수행하지 않으면 프로그램은 다음 오류를 표시합니다.

error: invalid conversion from ‘void*’ to ‘int*’ [-fpermissive]
p = malloc(n * sizeof(int));