일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 데이터구조
- 알고리즘
- 네트워크보안
- Yes
- 사이버보안
- 데이터분석
- 인공지능
- 네트워크
- 자료구조
- 데이터베이스
- 데이터과학
- I'm Sorry
- 프로그래밍
- 컴퓨터공학
- 클라우드컴퓨팅
- 자바스크립트
- 머신러닝
- 소프트웨어공학
- 보안
- 코딩
- 컴퓨터비전
- 파이썬
- 2
- 컴퓨터과학
- 버전관리
- 딥러닝
- 프로그래밍언어
- 소프트웨어
- 빅데이터
- 웹개발
- Today
- Total
스택큐힙리스트
malloc의 결과를 캐스팅해야 하나요? 본문
this question에서 누군가가 malloc의 결과를 캐스트하지 말아야 한다는 것을 제안했습니다. 예를 들면, 이렇게 해야 합니다: comment
int *sieve = malloc(sizeof(*sieve) * length);
~하는 대신에:
int *sieve = (int *) malloc(sizeof(*sieve) * length);
왜 그럴까요?
답변 1
요약:
int *sieve = (int *) malloc(sizeof(int) * length);
두 가지 문제가 있습니다. 캐스트와 sizeof에 변수 대신 타입을 인수로 사용하고 있습니다. 대신 다음과 같이 하십시오.
int *sieve = malloc(sizeof *sieve * length);
긴 버전으로 번역하기
네; 결과를 캐스팅하지 않습니다. 왜냐하면:
이 경우에는 자동으로 안전하게 void *이 다른 포인터 타입으로 승급되므로 불필요합니다.
이 코드를 혼란스럽게 만들며 캐스트는 읽기 어렵습니다 (특히 포인터 타입이 길 경우).
일반적으로 반복을 요구하므로 좋지 않습니다.
명확하게 말하자면, '캐스팅을 하지 않는다'라고 말했다는 것을 유의해주세요. '캐스팅을 할 필요가 없다'라고 말한 것은 아닙니다. 제 생각에는, 올바르게 했다 하더라도 캐스팅을 제외하는 것은 실패입니다. 단순히 이점이 없지만 많은 잠재적인 위험이 있으며 캐스팅을 포함하는 것은 위험에 대해 알지 못한다는 것을 나타냅니다.
또한, 댓글러들이 지적하듯이, 위의 내용은 C++이 아닌 직접적으로 C에 대한 이야기입니다. 저는 C와 C++을 서로 다른 언어로 확실히 믿습니다.
덧붙여 말하자면, 당신의 코드는 오류를 발생시킬 수 있는 불필요한 유형 정보를 반복합니다. 반환값을 저장하는 데 사용되는 포인터를 참조해 두 개를 잠그는 것이 더 좋습니다.
int *sieve = malloc(length * sizeof *sieve);
이는 가시성을 높이기 위해 length 를 앞으로 이동시키고, 인수가 타입 이름인 경우에만 필요한 중복 괄호를 sizeof 와 함께 제거합니다. 이것을 모르거나 무시하는 많은 사람들은 코드를 더 길게 만듭니다. 기억하세요: sizeof 는 함수가 아닙니다! :)
일부 특수한 경우에는 length를 앞으로 옮기면 가시성이 향상될 수 있지만, 일반적인 경우에는 식을 다음과 같이 쓰는 것이 더 좋습니다.
int *sieve = malloc(sizeof *sieve * length);
이 경우에는 먼저 sizeof를 유지해야 하므로, 최소한 size_t 수학으로 곱셈이 수행됩니다.
비교 : malloc(sizeof *sieve * length * width) 대 malloc(length * width * sizeof *sieve). 두 번째는 length * width가 width와 length보다 작은 유형일 때 오버플로될 수 있습니다.
답변 2
말록의 결과를 캐스트해야 하나요?
malloc() 함수는 C/C++ 프로그래밍에서 메모리 동적 할당을 처리하는 데 사용됩니다. 이 함수는 힙 메모리 중 가용한 임의의 공간을 할당하고, 메모리 주소를 반환합니다.
그러나 이 함수를 사용할 때 주의해야 할 것이 있습니다. 일부 개발자들은 malloc() 함수 호출 결과를 형식 지정자로 캐스트하고 있습니다. 그러나 이것은 종종 의미가 없습니다.
즉, C/C++언어에서는 포인터 변수의 타입은 해당 데이터 형식이 아니지만, malloc() 함수가 반환하는 것은 항상 void형* 즉, 포인터의 형식으로 이루어집니다. 그러므로 malloc() 호출 결과를 기본 데이터 형식으로 캐스트하는 것은 불필요합니다.
실제로 이러한 캐스트는 권장되지 않으며, 코드 가독성과 유지 보수성을 저하시킵니다. 또한 새로운 데이터 형식이 도입되거나 코드가 업데이트되면 이러한 형식 지정자 캐스트를 수정해야 할 수도 있습니다.
따라서, malloc() 함수의 결과를 캐스트하지 않는 것이 좋습니다. 그러나 이전 버전의 C/C++에서는 malloc() 결과를 형식 지정자로 캐스트해야 하는 경우가 있으므로, 이전 코드를 업데이트 할 때 적절히 고려해야 합니다.
메모리 효율성과 가독성을 고려하여 malloc() 함수를 사용할 때 데이터 형식 캐스트 결정을 신중하게 고려해야 합니다. 이렇게하면 코드를 개선하고 오류를 방지하는 데 도움이 됩니다.