2010-01-04 4 views
1

내 문자열의 예약 메모리를 만들기 위해 매크로를 만들었습니다. C. 다음과 같이 보입니다 :문자열의 메모리를 예약하는 방법은?

#define newString(size) (char*)malloc(sizeof(char) + size) 

개인 프로젝트에서이 매크로를 사용하지 않아야하는 이유가 있습니까? 나는 생산 코드에서 이것을하지 말아야한다는 것을 알고있다. 왜냐하면 모든 사람들이 그 헤더 파일을 가지고 있고 누구나가 newString이 매크로라는 것을 알기를 요구하기 때문이다.

답변

5

(char*)malloc(sizeof(char) * (size+1)) 사용에 아무 문제가 없다가 (+1 해당하는 경우, 문자열의 끝에 NULL을 설명하는 것입니다).

문자열을 복사하는 경우 strlen()은 문자열을 종료하는 NULL을 고려하지 않으므로 추가 메모리 char이 필요합니다.

malloc(size) 

newString(size)보다이 작성 짧아집니다 :

+4

왜 'size + 1'이 필요한지를 설명하기 위해 +1 – ChrisF

+1

'size + 1 '대신에 더 읽기 쉬운'size + sizeof ('\ 0')'를 사용하십시오. –

0

할당이 성공했는지 확인해야합니다.

char* ptr = (char*)malloc(sizeof(char) * size); //Not '+' size!! 
if (ptr == 0) //or NULL if defined 
{ 
    //cannot allocate 
} 

하지만 더 적절할 것 같다 매크로

0

가장 큰 이유는 sizeof(char) 항상 1. 그래서 대신 작성해야으로 정의되어있다. 또한, malloc는 C.

다른 이유에 캐스팅 할 필요가없는 void **을 의미 할 때 그래서 당신은 +를 작성하지 않는됩니다 반환합니다.

+1

sizeof (char)를 사용할 때 아무런 문제가 없습니다. 우리는 모두 그것이 1이라는 것을 알고 있으며, 변경 될 것 같지 않지만 추가 정보를 갖는 데에는 단점이 없습니다. 그가 이것을 반복해서 타이핑 할 필요가있는 것처럼 아니다. 그는 그 이유로 매크로를 정의합니다. –

+1

** @ A에 무엇을 추가 할 수 있습니다. Levy **는 "char"도 더 읽기 쉽고 마술 번호가 주위에있는 것을 말합니다. – Kredns

+2

그러나'sizeof (char) == 1'은 절대로 변하지 않을 것이고 단점이 있습니다 : 그것은 코드를 좀더 장황하고 어수선하게 만듭니다.필자가'sizeof (char) '를 사용하여 보았던 코드에 대해 필자는 즉시 의심스러워 할 것이다. – JaakkoK

1

전처리기를 사용하여 타이핑을 저장하는 것이 좋습니다. (그 길은 어둡고 무서운 것입니다.) 매크로에 무언가를 추가하기 전에 오래 가지 않아서 디버깅하기가 어려울 것입니다.

자신 만의 메모리 관리 기능을 사용하려면 실제 기능을 사용하고 무료 "삭제"기능을 제공하십시오.

성능에 대해 걱정이된다면 컴파일러는 똑똑해서 기능이 약간만 인라인 될 수 있습니다. 당신이 malloc 및 정의에 의해 sizeof(char) 동일 1의 결과를 캐스팅 할 필요가 없습니다 C에서와 같이

0

매크로는

malloc(size + 1) 

에 해당합니다. 그래서 실제로 많은 타이핑을 저장하지 않습니다. 나는 그것에 대해 어떤 이점도 보지 못하기 때문에 개인 프로젝트에서도 그것을 반대 할 것을 권합니다.

관련 문제