2012-10-28 2 views
2

고정 된 길이의 항목이나 문자가 없을 때 문자열 배열을 만드는 방법. 저는 포인터와 C를 처음 접했을뿐입니다. 여기에 게시 된 다른 솔루션을 이해할 수 없으므로 아래에 내 솔루션이 게시되어 있습니다. 바라건대 다른 사람들을 돕기를 바랍니다.malloc을 사용하여 C에서 문자열의 동적 배열을 만드는 방법

+0

당신은 가변 배열 (다른 길이의 배열의 배열), 또는 X * Y 고정 된 크기의 배열을 찾고 계십니까? 그리고 문자열의 2 차원 배열 (== char에 대한 포인터)을 찾고 있습니까? 아니면 문자열의 배열 (== char에 대한 포인터)에 대한 포인터의 배열을 찾고 있습니까? 아니면 char의 3 차원 배열을 찾고 있습니까? 배열에 포인터가 없습니까? – hyde

+0

배열에 문자열을 저장하고 string1 = array [1] 등과 같이 문자열에 접근 할 수있는 방법을 찾고있었습니다. 문자 포인터에 대한 포인터입니까? –

+0

좋아, 그래서 당신은 실제로 문자열 (= char 포인터)의 단일 배열을 찾고 있습니다. 2D 배열로 생각하면 도움이되지 않을 수도 있습니다 (특정 시점에서 그렇다고하더라도). – hyde

답변

1

단순히 argv 항목 표시 줄에서 첫 번째 항목의 배열을 만듭니다.

char **dirs = NULL; 
int count = 0; 
for(int i=1; i<argc; i++) 
{ 
    int arraySize = (count+1)*sizeof(char*); 
    dirs = realloc(dirs,arraySize); 
    if(dirs==NULL){ 
     fprintf(stderr,"Realloc unsuccessful"); 
     exit(EXIT_FAILURE); 
    } 
    int stringSize = strlen(argv[i])+1; 
    dirs[count] = malloc(stringSize); 
    if(dirs[count]==NULL){ 
     fprintf(stderr,"Malloc unsuccessful"); 
     exit(EXIT_FAILURE); 
    } 
    strcpy(dirs[count], argv[i]); 
    count++; 
} 
+0

int arraySize = (count + 1) * sizeof (dirs);를 int 배열 크기 = (count + 1) * sizeof (char *);로 변경해야합니다. 의미 상으로, 당신의 코드는'dirs'가'char ** '이지만'char *'를 할당하기 때문에 조금 부정확합니다. 실용적인 측면에서,'sizeof (char **) == sizeof (char *)'이후로 어떤 방법 으로든 차이를 만들어서는 안된다. –

+0

당신이 바로 그것을 편집했기 때문에 dirs가 포인터 배열이기 때문에 더 의미가 있습니다 –

1

네가 너무 가깝지만 주 배열을 너무 많이 할당하고있다.

char **dirs = NULL; 
int count = 0; 

dirs = malloc(sizeof(char*) * (argc - 1)); 

if(dirs==NULL){ 
    fprintf(stderr,"Char* malloc unsuccessful"); 
    exit(EXIT_FAILURE); 
} 

for(int i=1; i<argc; i++) 
{ 
    int stringSize = strlen(argv[i])+1; 
    dirs[count] = malloc(stringSize); 
    if(dirs[count]==NULL){ 
     fprintf(stderr,"Char malloc unsuccessful"); 
     exit(EXIT_FAILURE); 
    } 
    strcpy(dirs[count], argv[i]); 
    count++; 
} 
+0

네, 이것이 argv의 경우에 더 적절할 것입니다. 나는 어떻게 argv를 사용하고 있는지 보여주기 위해 예제로 사용했습니다. 만약 우리가 argc을 모른다면 –

2
char **twod_array = NULL; 

void allocate_2darray(char ***source, int number_of_slots, int length_of_each_slot) 
{ 
    int i = 0; 
    source = malloc(sizeof(char *) * number_of_slots); 
    if(source == NULL) { perror("Memory full!"); exit(EXIT_FAILURE);} 
    for(i = 0; i < no_of_slots; i++){ 
     source[i] = malloc(sizeof(char) * length_of_each_slot); 
     if(source[i] == NULL) { perror("Memory full!"); exit(EXIT_FAILURE);} 
    } 
} 

// 샘플 프로그램

int main(void) { 
    allocate_2darray(&twod_array, 10, 250); /*allocate 10 arrays of 250 characters each*/ 
    return 0; 
} 
+0

'alloc'_2darray 함수가 반환 될 때'source' 포인터가 사라질 것입니다. 인수 유형을'char ***'로 변경하고'& twod_array'로 전달해야합니다. 또한 균일 한 크기의 배열을 할당하기 때문에 각 문자열의 길이가 크게 다를 수있는 경우이 솔루션은별로 좋지 않습니다. –

+0

길이를 다양하게 realloc했습니다. 내가 잃어버린 소스 포인터를 이해하지, 당신은 포인터를 전달하고있어. –

+1

예, 값으로 포인터를 전달 중입니다. 원래 포인터가 수정되지 않습니다. 'twod_array'는 함수가 리턴 된 후'NULL'이됩니다. 포인터 자체에 대한 포인터를 전달해야하므로 'char ***'입니다. 나는 그것이 혼란 스럽다는 것을 안다. –

관련 문제