이제 사람들이 이것을 복제로 표시하기 전에 다음을 모두 읽었으며 그중 어느 것도 내가 찾고있는 답을 제공하지 않습니다.
- C FAQ : malloc의 반환 값을 캐스팅하는 데 어떤 문제가 있습니까?
- SO : malloc ()의 반환 값을 명시 적으로 캐스팅해야합니까?
- SO : C의 불필요한 포인터 캐스트
- SO : malloc의 결과를 캐스팅합니까?
C FAQ와 위의 질문에 대한 많은 답변은 캐스팅 malloc의 반환 값이 숨길 수 있다는 신비한 오류를 인용합니다 . 그러나 그들 중 어느 것도 실제로 그러한 오류의 구체적인 예를 제공하지 않습니다. 이제 경고 가 아니라 오류 라고 말한 것에주의하십시오 .
이제 다음 코드가 제공됩니다.
#include <string.h>
#include <stdio.h>
// #include <stdlib.h>
int main(int argc, char** argv) {
char * p = /*(char*)*/malloc(10);
strcpy(p, "hello");
printf("%s\n", p);
return 0;
}
캐스트를 사용하거나 사용하지 않고 gcc 4.2로 위 코드를 컴파일하면 동일한 경고가 표시되고 프로그램이 올바르게 실행되고 두 경우 모두 동일한 결과를 제공합니다.
anon@anon:~/$ gcc -Wextra nostdlib_malloc.c -o nostdlib_malloc
nostdlib_malloc.c: In function ‘main’:
nostdlib_malloc.c:7: warning: incompatible implicit declaration of built-in function ‘malloc’
anon@anon:~/$ ./nostdlib_malloc
hello
그렇다면 누구든지 캐스트 malloc의 반환 값으로 인해 발생할 수있는 컴파일 또는 런타임 오류의 특정 코드 예제를 제공 할 수 있습니까? 아니면 이것은 도시의 전설일까요?
편집 나는이 문제에 대해 잘 쓰여진 두 가지 주장을 발견했습니다.
- 캐스팅에 찬성 : CERT 권고 : 메모리 할당 함수 호출의 결과를 할당 된 유형에 대한 포인터로 즉시 캐스팅합니다.
- Casting에 대해 (2012-02-14 기준 404 오류 : 2010-01-27 의 Internet Archive Wayback Machine 사본을 사용합니다 . {2016-03-18 : "robots.txt로 인해 페이지를 크롤링하거나 표시 할 수 없습니다."})
void포인터를 사용하면 코드를 C ++로 컴파일 할 수 있습니다. 어떤 사람들은 그 기능의 말을, 나는 그것이 버그 말하고 싶지만)