2013-04-29 3 views
0

char * 배열의 배열을 어떻게 선언 할 수 있습니까? 그것은 char *arr[][]char * 배열의 배열을 선언하는 방법은 무엇입니까?

arr[0] = {"0a","0b","0c"}; 
arr[0][0] = "0a"; 
arr[0][1] = "0b"; 
.. 
arr[1] = {"1a","1b","1c"} 
  1. 인가 (값이 내 프로그램에서 나중에 채워집니다 때 ..)이 내 목표? 나는 꽤 혼란 스럽다.
  2. 이 매개 변수를 함수에 전달하면 어떨까요?
+2

당신은 몇 가지 힌트를 얻을 수 있습니다 (HTTP ://c-faq.com/decl/spiral.anderson.html). –

+0

@ JoachimPileborg : 가치있는 링크! – deepmax

+0

@MM. 많은 고급 선언에 유용하지만이 경우에는 완벽하지 않을 수 있습니다. 예를 들어'char * v [K] [L];'선언은 첫 번째 라운드에서 포인터를 건너 뛰고 두 번째 배열로 직접 이동해야한다는 것은 분명하지 않습니다. –

답변

0

fill

void fill(char *arr[10][2]) { 
    arr[0][0] = strdup("k"); 
    arr[0][1] = strdup("ki"); 
    arr[1][0] = strdup("s"); 
    arr[1][1] = strdup("si"); 
} 

void clean(char *arr[10][2]) { 
    free(arr[0][0]); 
    free(arr[0][1]); 
    free(arr[1][0]); 
    free(arr[1][1]); 
} 


int main (int argc, char *argv[]){ 

    char *array[10][2] = {NULL}; 
    fill(array); 
    printf("%s %s\n", array[0][0], array[1][1]); 

    // when arr[i][j] bcome useless in your code, do not forget to free memories 
    clean(array); 
} 
clean 기능은 다음과 같은 방법으로도 정의 할 수 : 당신이 [시계/나선형 규칙]에 대해 읽어 경우

void fill(char *arr[][2]) { 
void clean(char *arr[][2]) { 
+0

arr을 매개 변수로 가져 와서 내용을 실제로 변경할 수있는 함수의 시그니처가 어떻게 보이는지 확인할 수 있습니까? func (char ???) – Popokoko

+0

is func (char (* arr) [] [SIZE])? erm, lost :( – Popokoko

+0

@Popokoko code updated – MOHAMED

0

이 거의 모든 사람이 다

char ** a; 
다음

a에 대한 혼동됩니다 한 가지 유의 하나 개 이상의 문자를 하나 이상의 포인터에 대한 포인터입니다. 메모리에 어딘가에 포인터가 있고 각 포인터는 문자열을 가리 킵니다 (말하자면). a은이 포인터 중 첫 번째 포인터를 나타냅니다. (a+1)은 두 번째 것을 말합니다. 문자 블록은 메모리의 어딘가에 있지만 반드시 서로 가깝지는 않습니다.

for (int i = 0 ; i < 10 ; ++i) { 
    a++ = malloc(100); 
} 

또는 당신이 할 수 있습니다 : :이 작업을 수행 할 수

char *b = malloc(1000); 
for (int i = 0 ; i < 10 ; ++i) { 
    a++ = b; 
    b += 100; 
} 

을 그리고 당신은 100 자 각 10 포인터와 배열에 채워 것입니다. (음, 정말 100 개 문자에 대한 공간을 우리는 아직 문자를 입력하지 않았기 때문에.)

여기
char* a[]; 

다시, a 문자의 무리의 첫 번째 포인터의 무리입니다. 실제로는 char ** a과 같지만 재사용 할 경우 더 합리적입니다.

for (int i = 0 ; i < 10 ; ++i) { 
    a[i] = malloc(100); 
} 

위와 동일한 작업을 수행하지만 주어진 문자 블록으로 돌아가는 것이 더 쉬워집니다. 예를 들어, 우리는 이것은 같은 길이의 블록으로 분할 할 수있는 문자의 무리에 대한 포인터 인 것을 약간 다릅니다 strcpy(a[4], "Bob was here");

char a[][]; 

할 수 있습니다. 스택에 할당하기에는 너무 큰 경우가 아니라면 일반적으로이 경우 크기를 지정합니다. char a[10][100]은 1,000 개의 문자 스폿을 100 개의 10 개의 그룹으로 나누어 메모리에 할당합니다.

예제 {"0a","0b","0c"};은 세 개의 메모리 블록을 할당하는 방법입니다. 각각 3 바이트 길이이며 미리 입력이 문자로 (그리고 닫는 \ 0 문자

+0

아마도 이것들은 동등하지 않다는 것을 지적 할 가치가 있습니다. –

+0

더 실질적으로 - 차이점을 알려주세요. – Popokoko

+0

예. 그것은 그가 무엇을 의미하는지에 달려 있습니다. –

2

닫기하지만, 한 번에 모든 집계 초기화 사용과 같이 할 수 있습니다.

char arr[][2][3] = 
{ 
    {"0a", "0b"}, 
    {"1a", "1b"}, 
}; 

참고 모든하지만 가장 중요한 (왼쪽이 가장) 배열해야 명시 적으로 크기 또는 그냥 포인터로 각각의 내부 문자열을 선언 할 수있다 :.

const char * arr[][2] = 
{ 
    {"0a", "0b"}, 
    {"1a", "1b"}, 
}; 

그것은 당신의 데이터가 어떻게 구조화에 따라 달라집니다, 어떻게 정적 . stl std :: vector를 사용하는 대안은 if 각 배열의 내용을 동적으로 지정하려고합니다.

+0

+1, ** ** 정답입니다. –

+0

const 또는 하드 코딩 된 배열로 정의하고 싶지 않습니다. 너는 그것을 char * arr [] [size]로 정의해야 함을 의미합니까? 것은 각 배열의 길이에 대해 그렇게 확신하지 못합니다 – Popokoko

+0

@ H2CO3 - thx! Popokoko - 데이터가 컴파일 타임에 알려지고 구조가 고정되어 있으면 (배열 수 등), 정적 표현을 선택하는 것이 좋습니다.이 방법은 더 간단하고 빠를 것입니다. 데이터를 한 번 채워야하는 경우 (const, 초기화 후)에는 std :: vector와 같은 런타임 지원이 필요합니다. 마지막으로, 데이터가 런타임에 많이 변형 될 경우 (나는 의심 스럽습니다), 다른 컨테이너를 선택하여 필요한 복잡성 (예 : unordered_map 또는 무언가)을 표현할 수 있습니다. 그것은 모두 프로그램 특성에 달려 있습니다. –

1

char * arr [] []?

소리가 약합니다. 그러나 선언에서 배열의 크기를 제공해야합니다.

0
int main (int argc, char *argv[]){ 

    char arr[10][2][3] = {0}; 

    memcpy(&arr[0][0], "k", sizeof(arr[0][0])); 
    memcpy(&arr[0][1], "ki", sizeof(arr[0][0])); 
    memcpy(&arr[1][0], "s", sizeof(arr[0][0])); 
    memcpy(&arr[1][1], "si", sizeof(arr[0][0])); 

    printf("%s %s\n", arr[0][0], arr[1][1]); 

} 
관련 문제