2010-02-13 4 views
10

메모리를 이중 포인터에 할당하는 방법을 이해하는 데 문제가 있습니다. 문자열 배열을 읽고 저장하려고합니다.이중 포인터에 메모리를 지정 하시겠습니까?

char **ptr; 
    fp = fopen("file.txt","r"); 
    ptr = (char**)malloc(sizeof(char*)*50); 
    for(int i=0; i<20; i++) 
    { 
     ptr[i] = (char*)malloc(sizeof(char)*50); 
     fgets(ptr[i],50,fp); 
    } 

이 대신에 내가 그냥 잘못 될 메모리와 저장 문자열

char **ptr; 
    ptr = (char**)malloc(sizeof(char)*50*50); 

의 큰 블록을 할당? 그리고 만약 그렇다면 왜 그렇습니까?

+6

"이중 포인터"라고 부르지 마십시오. 잘못된 발로 정신적으로 벗어나게됩니다. 포인터에 대한 포인터입니다. –

답변

0

이중 포인터는 다른 포인터에 대한 포인터 일뿐입니다. 그래서 당신은 이런 식으로 할당 할 수 있습니다

char *realptr=(char*)malloc(1234); 
char **ptr=&realptr; 

당신은 (함수가 반환 후이 잘못 그래서 스택 포인터 변수에이 예에서 이중 포인터 점) 포인터가 저장됩니다 명심해야 .

-3

두 포인터는 간단히 말해 포인터에 대한 포인터입니다. 많은 경우에 다른 유형의 배열로 사용됩니다. 당신은 문자열의 배열을 만들려면 예를 들어

, 당신은 간단하게 할 수있는이 크기 10의 배열을 생성합니다

char** stringArray = calloc(10, 40); 

은 각 요소 길이의 문자열입니다 (40)

따라서 stringArray [5]를 사용하여이 항목에 액세스하고 여섯 번째 위치에 문자열을 가져올 수 있습니다.

char* str = (char*)malloc(40); 
char** pointerToPointer = &str //Get the address of the str pointer, valid only in the current closure. 

여기에서 자세한 내용을보실 : 이 good array tutorial

+0

아니요, char *가 4 바이트를 차지한다고 가정하면 100 개의 char * 배열을 만듭니다. –

+0

한스의 말은 정확합니다. 더구나, 100 char *의 배열은 (calloc을 사용 했으므로) 0으로 초기화되므로 모든 char *이 null을 가리키고 해당 배열 위치에 액세스하면 오류가 발생합니다. –

10

두 번째 예는

한 사용, 다른 사람이 포인터에 대한 포인터, 위에서 언급 한대로,에 의해 간단하게 할당 할 수있다 각 메모리 위치는 개념적으로 char*이 아니기 때문에 char이기 때문에 잘못되었습니다. 당신이 약간 생각을 변경하는 경우,이 도움이 될 수 있습니다 :

때문에 그
char *x; // Memory locations pointed to by x contain 'char' 
char **y; // Memory locations pointed to by y contain 'char*' 

x = (char*)malloc(sizeof(char) * 100); // 100 'char' 
y = (char**)malloc(sizeof(char*) * 100); // 100 'char*' 

// below is incorrect: 
y = (char**)malloc(sizeof(char) * 50 * 50); 
// 2500 'char' not 50 'char*' pointing to 50 'char' 

당신이 C에서 문자 배열/포인터의 배열을 어떻게, 첫 번째 루프가 될 것입니다. 문자 배열 배열에 고정 된 메모리 블록을 사용하는 것은 괜찮지 만, char**이 아닌 char*을 사용합니다. 메모리에 포인터가 없기 때문에 단지 입니다.

char *x = calloc(50 * 50, sizeof(char)); 

for (ii = 0; ii < 50; ++ii) { 
    // Note that each string is just an OFFSET into the memory block 
    // You must be sensitive to this when using these 'strings' 
    char *str = &x[ii * 50]; 
} 
+1

마지막 줄이'char * str = x + (ii * 50)'가 아니어야합니까? – redFur

+2

그리고'malloc()'의 결과를 캐스팅하지 마라! –

1

케이스 -1 기억하는 다른 간단한 방법 :

단계 1 : 숯 * P는;

단계 -2 : 가

다음 문자 (P *)과 같은 읽어주세요 ==> P 방금 교정기없는 유형 (스텝 2)의 경우의 malloc 할 필요

즉, p = malloc을 (를 sizeof (숯) * some_len) 숯불 지금

포인터는

케이스 -2 :

단계 1 : 숯 ** P;

단계 -2 :

아래 숯 * (P *)과 같은 읽어주세요 ==> p는

지금 방금 유형의 malloc을 할 필요가 * 숯불에 대한 포인터입니다 (스텝 2) 괄호없이

즉, p = malloc을 (를 sizeof (숯불 *) * some_len) ;

케이스 -3 :

아무도이를 사용하지 않습니다하지만 단지 설명을 위해

문자에 대한 *** 피;

char ** (* p); ==> p는 char **에 대한 포인터입니다 (위의 경우 2).

p = malloc (sizeof (char **) * some_len);

0

Pent의 대답에 덧붙여 그가 올바르게 지적했듯이 함수가 반환되면 함수의 활성화 레코드의 메모리 위치를 가리키기 때문에이 이중 포인터는 사용할 수 없습니다. 함수가 반환되면). 이 함수가 리턴 한 후이 더블 포인터를 사용하려는 경우, 당신은이 작업을 수행 할 수 있습니다

char * realptr = (char *) malloc(1234); 
char ** ptr = (char **) malloc(sizeof(char *)); 
*ptr = realptr; 
return ptr; 

함수의 반환 형식은 분명히 이것에 대한 char **해야합니다.

관련 문제