2013-10-09 6 views
-2
char** key; 

strcpy(*key, "Hello"); 
strcpy(*(key+1), "World"); 

printf("%s", *key); 

두 번째 strcpy은 오류가없는 반면 첫 번째 strcpy은 세그멘테이션 오류가 있습니다. 원래 목적을 달성하기 위해 어떻게 수정해야합니까?strcpy를 사용하는 C의 세그먼트 오류 오류

+3

어. 이 코드가 전부입니까? 키를 초기화하도록 초기화하지 않았습니다. 그래서 그것은 strcpy로 전달하기 위해 char *로 역 참조하는 초기화되지 않은 포인터입니다. – kfsone

답변

1

당신이하고있는 일은 정의되지 않은 행동입니다.

char * strcpy (char * destination, const char * source) 

strcpy 수정할 수있는 대상이 있어야합니다. 쓰기 위해 메모리를 할당하지 않았으므로이 문제를 일으키는 char **을 전달 중입니다. 당신은 메모리가 strdup()을 시도 할당 건너 뛰려면

char* key = malloc(sizeof(char)*7); // 7 because it can Hold World with a Nul character 

    strcpy(key, "Hello"); 
    strcpy((key+1), "World"); 

    printf("%s", key); 
+0

조금 더 설명 해주시겠습니까? –

+0

'sizeof (char)'는 이렇게 사용할 때 항상 중복됩니다. C 표준 *에 의해 1로 정의됩니다. – hyde

0

당신은, 당신이 strcpy() 전에 메모리를 할당해야합니다

이것은 (아마도) 당신이하려고했던 것입니다. 첫 번째 strcpy를이 세그먼트 오류를 ​​가지고있는 동안

당신이 정말로, char *key

두 번째 strcpy를이 오류가없는
char* key = malloc(sizeof(char) * 100); //allocate to store 100 chars 
strcpy(key, "Hello"); 
strcpy(key + strlen(key), "World"); 
//or strcat(key, "World"); 

로하고, char **key을 원하지 확인, 단순화하기 위해

을 수행하는 방법 세분화 오류로 인해 실행되지 않은 경우 두 번째 오류가 발생하지 않는다는 것을 알고 계십니까?

0

key에 할당 된 메모리가 없습니다. 첫 번째 strcpy 앞에 malloc을 사용하여 메모리를 할당 할 수 있습니다.

*key = malloc(32 * sizeof(char));  // pick a size of buffer 

두 번째 호출이 segfault를 일으킬 것으로 생각됩니다. 할당되지 않은 공간에 쓰려고합니다.

+0

@DennisMeng 좋은 점은 코드를 잘못 읽었습니다. – Steve

1

키에 버퍼를 할당하고 있는지 여부는 코드에서 분명하지 않습니다. 나는 그것이 당신이 SEG 잘못을 얻는 이유라고 생각합니다.