2009-12-02 3 views
1

아래 두 코드 조각간에 차이가 있습니까? 하나는 문자 배열이고 다른 하나는 문자 배열 포인터이지만 동일한 동작을 수행합니까?문자 배열 질문 C++

예 1

char * transport_layer_header; 
// Memory allocation for char * - allocate memory for a 2 character string 
char * transport_layer_header = (char *)malloc(2 * sizeof(char)); 
sprintf(transport_layer_header,"%d%d",1,2); 

예 2

char transport_layer_header[2]; 
sprintf(transport_layer_header,"%d%d",1,2); 
+1

'sprintf' 대신'snprintf'를 사용하는 것이 좋습니다. 전자는 타겟 배열을 오버런하지 않도록 경계 검사를 제공합니다. –

+3

후행 null을 설명하기 위해 2 자 문자열에 3자를 할당해야합니다. –

+0

지적했다. 감사. – halluc1nati0n

답변

12

예, 차이가있다. 첫 번째 예에서는 힙에 두 요소 문자 배열을 동적으로 할당합니다. 두 번째 예제에서는 스택에 로컬 2- 요소 char 배열이 있습니다.

malloc에 의해 반환 된 포인터가 free이 아니기 때문에 첫 번째 예에서 메모리 누수가 발생했습니다.

이들은 종종 동일한 방법으로 사용할 수 있습니다. 예를 들어 sprintf을 사용하는 경우와 같은 방식으로 사용할 수 있지만 근본적으로 다릅니다.

+0

후속 조치로서, 'malloc'은 힙에서 사용 가능한 메모리를 찾아야하기 때문에 일반적으로 세마포어가 사용됩니다. 이 코드가 ISR 또는 기타 중요 섹션에있는 경우이 문제가 발생할 수 있습니다. 스택을 사용하는 것은 컴파일러가 스택 포인터에 하나의 추가로 "할당"을하기 때문에 상당히 빠르며, 걱정할 필요가 없다. – jheddings

5

다른 차이점은 첫 번째 예제는 힙의 데이터를 손상시키고 두 번째 예제는 스택의 데이터를 손상시키는 것입니다. 후행 \ 0에 대한 공간도 할당하지 않습니다.

3

가장 중요한 차이점은 IMO는 두 번째 옵션 인 transport_layer_header가 const 포인터 (다른 위치를 가리킬 수 없음) 인 점입니다. 첫 번째 옵션의 경우와 같이 할 수 있습니다.

이것은 이전 답변에 추가되었습니다.

1

"null이없는 공간"문제를 해결한다고 가정하면, 즉 2 대신 3 바이트를 할당하면 동적 메모리가 필요한 경우 일반적으로 malloc() 만 사용하게됩니다. 예를 들어 배열의 크기를 모를 경우 malloc을 사용할 수 있습니다.

지적한대로 malloc()을 사용하고 나중에 메모리를 비우지 않으면 메모리 누수가 발생합니다.

한 가지 더 요점 : 실제로 메모리를 확보했는지 확인하기 위해 malloc()의 반환 값을 확인해야합니다. 나는 솔라리스에서 malloc()이 결코 실패하지 않는다는 것을 안다. (위에서 언급했듯이 프로세스가 잠들지 않기를 바란다면 잠들지 않는 것이 좋은 이유 일 것이다). 리눅스에서 malloc()이 실패 할 수 있다고 가정합니다 (즉, 사용 가능한 메모리가 충분하지 않은 경우). [잘못하면 나를 바로 잡으십시오.]