2017-03-28 1 views
-1

재진입해야하는 함수를 작업 중입니다.이 함수는 메모리 버퍼를 인수로 사용하며 모든 메모리 요구에 대해 이러한 버퍼를 사용해야합니다. 즉, malloc을 사용할 수 없으며 제공된 버퍼를 메모리로 가져와야합니다.문자열 배열을 char 배열에 오버레이합니다.

내가 겪었던 문제는 지정된 크기의 char 배열에 문자열 배열을 오버레이하는 방법 (버퍼는 char *으로 제공됨)이지만 내 결과는 문자열 배열 (char **)입니다. 나는의 주소를 작성하는 방법을 알아내는 약간의 도움이 필요하지만

   alex danny max  

: 주석 문제가있는 줄 인쇄 위의 코드와

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define BUFFER_SIZE 100 
#define INPUT_ARRAY_SIZE 3 

char *members[] = { 
     "alex", 
     "danny", 
     "max" 
}; 


int main() { 
    // this simulates a buffer that is presented to my func 
    char *buffer = malloc(BUFFER_SIZE); 
    char *orig = buffer; 
    memset(buffer, NULL, BUFFER_SIZE); 

    // pointers will be stored at the beginning of the buffer 
    char **pointers = &buffer; 

    // strings will be stored after the pointers 
    char *strings = buffer + (sizeof(char *) * INPUT_ARRAY_SIZE); 

    for(int i = 0; i < INPUT_ARRAY_SIZE; i++) { 
     strncpy(strings, members[i], (strlen(members[i]) + 1)); 
     // Need to store pointer to string in the pointers section 
     // pointers[i] = strings; // This does not do what I expect 
     strings += ((strlen(members[i]) + 1)); 
    } 

    for (int i=0; i < BUFFER_SIZE; i++) { 
     printf("%c", orig[i]); 
    } 

    // Need to return pointers 
} 

: 아래

는 생식입니다 처음에는 문자열. 물론이 작업을 수행하는 더 쉬운 방법이 있으면 알려 주시기 바랍니다.

+2

귀하의 질문에 관련없는,하지만. 'memset'을 사용하여 메모리를 0으로 설정하려면 정수 0 '0'을 사용하십시오. –

+2

귀하의 문제에 관해서는, 배열은 자연스럽게 첫 번째 요소에 대한 포인터로 붕괴한다는 것을 기억하십시오. 이렇게하면 배열'멤버 '가'char **'유형의'& members [0]'으로 썩게됩니다. 따라서 포인터를 배열로 사용하고 싶다면, 포인터 변수 대신'char **'형 변수를 사용해야하지만, 주소 대신에'buffer'의 첫 바이트를 가리 키도록 초기화해야합니다 변수 'buffer'의). 그런 다음 포인터의 배열처럼'포인터 '를 사용하고 멤버를 initilize하여 버퍼에 복사 한 문자열을 가리킬 수 있습니다. –

+2

또 다른 관련없는 노트에서 어째 든 전체 문자열과 터미네이터를 복사하려는 경우 왜'strncpy'를 사용해야합니까? 왜 대신에'strcpy'를 쓰지 않으시겠습니까? –

답변

2

여기를 한번보세요.

/* conditions : 
* 
* 'buffer' should be large enough, 'arr_length','arr' should be valid. 
*    
*/ 

char ** pack_strings(char *buffer, char * arr[], int arr_length) 
{ 

    char **ptr = (char**) buffer; 
    char *string; 
    int index = 0; 

    string = buffer + (sizeof(char *) * (arr_length+1)); /* +1 for NULL */ 
    while(index < arr_length) 
    { 
     size_t offset; 

     ptr[index] = string; 
     offset = strlen(arr[index])+1; 
     strcpy(string,arr[index]); 

     string += offset; 
     ++index; 
    } 
    ptr[index] = NULL; 
    return ptr; 
} 

사용 NULL`가 널 * 포인터 * 아닌 "null 값"입니다`

char **ptr = pack_strings(buffer,members,INPUT_ARRAY_SIZE); 

    for (int i=0; ptr[i] != NULL; i++) 
     puts(ptr[i]); 
+0

감사합니다. Binary_10 - 정확히 내가 무엇을 찾고 있었습니까. – AlexT

관련 문제