2010-07-15 8 views
1

char ** r; r = (char **) malloc (10);이중 포인트 메모리 할당

위의 할당으로 충분합니까? 내가 char * r에 대한 루프를 통해 할당 할 필요가 없습니까? 모든 올바른 설명 할 수 있습니까?

+3

위의 할당으로 충분합니까? 거의 정확하지 않습니다 (2 ~ 5 바이트 포인터가있는 이상한 시스템이 아니라면 ...). C 책을 참고하십시오. C 책이 없으면 책을 가져 오는 것이 좋습니다. 좋은 책 목록을 [The Definitive C Book Guide and List] (http : // stackoverflow.)에서 찾을 수 있습니다.com/questions/562303/the-definitive-c-book-guide-and-list) –

답변

4

10 개의 char 포인터를 할당한다고 가정하면이 방법은 작동하지 않습니다. 대신 10 바이트의 메모리를 할당합니다.

char 포인터는 2 바이트 이상일 수 있습니다. 다행히 컴파일러가 실제 크기를 알고 있기를 바랍니다.

char** r = (char**)malloc(sizeof (char*) * 10); 

이렇게하면 10 개의 char 포인터에 충분한 공간이 할당됩니다. 그러나 현재 그들은 아무데도 유용하지 않다고 지적합니다.

이렇게하면 20 개의 할당 된 메모리를 가리키는 10 개의 char 포인터가 생깁니다.

은 (거기는 sizeof(char) 것이기 때문에 여기 반군 sizeof없고, sizeof(char)은 1로 정의된다)

+0

작은 점 : C에서는 malloc의 결과를 캐스팅하지 않는 것이 좋습니다 (이 작업은 C++하지만 C에서는 필요하지 않으므로 생략해야합니다. 그렇게하지 않으면 유용한 컴파일러 경고가 표시되지 않습니다. –

+0

더 나은 스타일은 char ** r = malloc (sizeof (* r) * 10); – Nyan

5

가장 확실하게 잘못되었습니다. char*은 대부분의 아키텍처에서 10을 나눈 크기가 아닙니다. 이제 r의 각 요소는이 char*을 할당 어딘가에 가리키는 데 사용 될 수있다

char** r; 
// Allocate an array of 10 char* in r 
r = (char**)malloc(10 * sizeof(*r)); 

:

는 여기에 몇 가지 예제 코드입니다.

위의 코드에서 저는 (사용자가 한 것처럼) malloc의 결과를 캐스팅했습니다. 이것은이 코드가 캐스트가 필요없는 C 컴파일러가 아닌 C++ 컴파일러로 컴파일 된 경우에만 필요합니다. OTOH, C++에서는 이 아니라 new이 필요합니다.

+0

sizeof * r을 사용하는 경우 +1 –

0

숯불이 ** R은 문자 포인터에 대한 포인터입니다. 그것은 문자열의 배열로 볼 수 있습니다. 배열의 모든 메모리를 초기화하려면,

r = (char **)malloc(sizeof(char *) * NUMBER_OF_ELEMENTS_OF_ARRAY); 
for (i = 0; i < NUMBER_OF_ELEMENTS_OF_ARRAY; i++) { 
    r[i] = (char *)malloc(sizeof(char) * LENGTH_YOU_WANT_STRING); 
} 

또는 이와 비슷한 것을 사용해야합니다.

0

당신이 원하는 방법으로 "2 차원"구조에 대한 메모리를 할당하는 간단한 방법은 다음과 같습니다

#include <stdlib.h> /* for malloc() */ 

char **r; 
/* we will allocate 'size' values, each of 'data_size' length */ 
size_t size = 10; 
size_t data_size = 42; 
size_t i; 

/* allocate 'size' objects of the right type. 
* 
* Notes: 
* 
* 1. no casting the return value of malloc(), 
* 2. r = malloc(size * sizeof *r) is type-agnostic, so 
     if you change the type of r, you don't need to remember 
     to change the malloc() call */ 

r = malloc(size * sizeof *r); 

/* Error check omitted for clarity. In real code, always check for return 
    value of malloc() */ 

for (i=0; i < size; ++i) { 
    /* once again, no cast, and we use x = malloc(size * sizeof *x) idiom */ 
    r[i] = malloc(data_size * sizeof *r[i]); 
} 

위 기법의 장점은 3, 4에 대한 최소한의 노력으로 작동한다는 것입니다 - 또는 더 높은 차원을 가지며 읽기 쉽습니다.

위의 코드에서 sizeof(char)이 1이되도록 보장 되었기 때문에 malloc(data_size * sizeof *r[i]) 대신 malloc(data_size)을 쓸 수 있었지만, 다시 말하면 유형 위주이므로이 양식을 선호합니다.