2010-02-02 4 views
2

함수의 반환 값을 저장하기 위해 char 배열을 작성하려고합니다. 다음 함수에서 데이터는 ***** valv **에 저장됩니다. 데이터에 액세스하기 위해 extern 변수를 작성하는 방법은 무엇입니까?C++ 3 차원 문자 배열을 사용하고 전달하는 방법은 무엇입니까?

int credis_lrange(REDIS rhnd, const char *key, 
        int start, int end, char ***valv) 
{ 
    int rc; 

    if ((rc = cr_sendfandreceive(rhnd, CR_MULTIBULK, "LRANGE %s %d %d\r\n", 
           key, start, end)) == 0) 
    { 
    *valv = rhnd->reply.multibulk.bulks; 
    rc = rhnd->reply.multibulk.len; 
    } 

    return rc; 
} 

해결 방법 : 모든 사람에게

char **elements; 

int size = credis_lrange(this->redis,"object_2",600,603,&elements); 

for (int i=0; i<size;i++) { 
    cout << "element: " << elements[i] << endl; 
} 

감사합니다!

+1

많은 중복이 있습니다. http://stackoverflow.com/questions/917783/how-do-i-work-with-dynamic-multi-dimensional-arrays-in-c http://stackoverflow.com/questions/1874604/passing-an으로 시작하십시오. -array-of-arrays-in-c http://stackoverflow.com/questions/2003745/pointer-address-in-ac-multidimensional-array 그리고 다른 것들이 있습니다 ... – dmckee

+0

그것은 당신의 질문에 직접 답하는 것이 아니라 배열은 C++에서 "비 우선적"이므로 STL 컨테이너 클래스 (아마도 벡터)를 사용해야합니다. – Mawg

+0

cred lib는 C lib입니다. C++ 벡터를 C 언어로 사용할 수 있습니까? – dan

답변

5
char ***element[size]; 

정확히 차원 배열되지만 char 포인터 - 대 - 포인터 - 대 - 포인터 size 요소의 배열이 아니다.

를 사용하여 다음 중 하나 : 또한

char e[ D1 ][ D2 ][ D3 ]; /* D1, D2, D3 are integral constants */ 
char *e[ D2 ][ D3 ]; 
char e[][ D2 ][ D3 ]; 

, 당신은 단순히 당신의 함수에 인수로 e을 speficying에 의해 그것을 전달할 수 있습니다.

더 자세히 읽으면서 매개 변수는 실제로 3D 배열이 아니라 C 스타일 문자열 배열에 대한 포인터임을 나타냅니다. 구문은 동일 할 수 있으며 의도는 다릅니다.

  • 는 각 문자열
    • 할당 메모리
    • 의 배열
    • 에 저장할 문자열의 수를 지정합니다

      이 경우

      , 두 가지 작업을 수행해야합니다

    • char 배열에 문자열 데이터 복사

마지막으로이 문자열 배열의 주소를 credis_lrange 함수로 전달하게됩니다.

+0

안녕하세요. Dirk, 귀하의 초고속 회신에 감사드립니다. 그래서 3 for 루프를 만들고 어레이 레벨마다 각 요소에 메모리를 할당해야합니까? – dan

+0

Dirks의 첫 번째 제안을 사용하는 경우 메모리를 할당 할 필요가 없습니다. 그것은 모두 하나의 인접한 덩어리로 할당됩니다. "e"를 사용할 때 그것은 힙에서 메모리를 할당하거나 해제 할 필요가 없다는 것을 가리키는 포인터 (char에 대한 포인터에 대한 포인터)와 같이 많이 작동합니다. – Steve314

+0

Dirk의 첫 번째 예제에서는 메모리를 할당 할 필요가 없습니다. 두 번째 예제에서는 한 번 반복하여 메모리를 할당해야합니다. – Jagannath

0

Google에서 단 하나의 히트 만 찾았지만 cr_sendfandreceive 함수가 rhnd-> reply.multibulk.bulks 멤버를 할당하는 것처럼 보였으 므로 실제로 전달하지 않아도됩니다 (rhnd 처음에는).

복사하려는 경우 요소를 char **로 선언하고 해당 주소를 전달하거나 참조를 사용하여 대량 멤버와 배열의 각 문자열을 복제하는 메서드 내부에서 루프에서).

+0

안녕 Neil, 답장을 보내 주셔서 감사합니다. 이것에 대한 샘플 코드를 제공해 주시겠습니까? – dan

+0

이것은 기본적인 아이디어이지만 오류 검사가 전혀없는 것은 분명합니다 : char ** clone (int argc, char ** argv) { char ** result = (char **) malloc (argc * sizeof (char *)); while (argc--) 결과 [argc] = strdup (argv [argc]); 반품 결과; } – Neil