2011-12-29 3 views
0

내가 여기에 C에서 문자열 중 하나 개 배열을 만들려고하는 코드입니다 :C에서 하나의 문자열 배열을 만들지 못하는 이유는 무엇입니까?

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

int main() 
{ 
    char *foo[100]; 
    strcpy(foo[0], "Testing this"); 
    printf("%s ", foo[0]); 

    return 1; 
} 

그러나 나는 그것을 컴파일 할 때, 단순히 휴식. 오류가없고 아무것도 없습니다. 단순히 작동하지 않고 중단됩니다. 어떠한 제안? 트라이 숯불 * foo [10] 때 작동하지만, 난 그냥 10 문자열로 작업 할 수 없습니다

답변

4

포인터의 배열을 할당했지만 그들이 가리 키도록 어떤 메모리도 할당하지 않았습니다. 힙에서 메모리를 할당하려면 malloc으로 전화해야합니다.

char *foo[100]; 
foo[0] = malloc(13); 
strcpy(foo[0], "Testing this"); 

당연히 당신은 당신이 그것으로 완료 될 때 일부 나중에 메모리를 free해야합니다.

코드에서 undefined behavior을 호출합니다. 기본적으로 의도 한대로 작동하는 코드를 포함하여 모든 일이 발생할 수 있습니다. char *foo[10] 버전이 의도 한대로 작동하면 운이 좋을 것입니다.

제쳐두고, main() 정의가 잘못되었습니다. int main(void)이어야합니다.

+0

한 가지 더, 왜 이것이 또한 실패하는지 아십니까? – FinalDestiny

+0

고맙습니다. :) – FinalDestiny

1

할당되지 않은 포인터를 할당하고 있습니다. char * foo [100]은 할당되지 않은 100 개의 포인터로 이루어진 배열이며 메모리에있는 알 수없는 위치, 아마도 액세스 할 수없는 위치를 가리 킵니다.

0

다른 사람의 답변에 따라 확장 :

char *foo; 

은 문자에 대한 포인터입니다. 단일 문자의 주소가 할당되거나 '\ 0'에 의해 종료되는 문자 시퀀스의 첫 번째 주소가 할당 될 수 있습니다. 또한 malloc()을 통해 주소가 할당 될 수도 있습니다.

char foo[100]; 

은 최대 99 개 문자의 문자열과 종료 '\ 0'문자 100 개 문자를위한 공간 또는 공간입니다.

char *foo[100]; 

은 100 문자 포인터, 즉 100 char *foo;입니다.

1

포인터를 가리 키도록 100 개의 포인터를 생성합니다. David의 설명처럼 동적으로 메모리를 할당해야합니다. 당신이 문자열 (또는 최대)의 크기를 알고있는 경우, 당신은 또한 컴파일러를 가질 수 있습니다 당신을 위해이 작업을 수행 :

// Create an array of 10 strings of size 100 and initialize them automatically 
char foo[10][100] = {0}; 

// Now you can use it them and not worry about memory leaks 
strcpy(foo[0], "text"); 

// Or use the safer version 
strcpy_s(foo[0], 100, "text"); 
0
#include <stdlib.h> 
#include <stdio.h> 

int main(void){ 
    char *foo[100]; 
    foo[0] = malloc(13*(sizeof(char))); 
    strcpy(foo[0], "Testing this"); 
    printf("%s ", foo[0]); 

    return 0; 
} 

이 코드의 수정 된 버전입니다.

MISTAKE: not allocating enough memory for the string. 

CORRECTION: using malloc to allocate 13 blocks of memory for the string. 
관련 문제