2012-10-21 2 views
0

다음 코드가 있습니다.문자열 복사 (strcpy)

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

int main() 
{ 
char * l; 
*l = 'c'; 
*(l+1) = 'g'; 
*(l+2) = '\0'; 

char *second; 
strcpy(second, l); 
printf("string: %s\n", second); 
} 

내가 말하는 것입니다 실행
출력은 "분할 오류"라고 .... 어떤 제안 ??

감사

답변

1

l가 초기화되지 않은 포인터입니다; 당신은 그것을 역 참조 할 수 없습니다. 그 내용을 쓰는 데 충분한 공간을 할당해야합니다 (정적 (1) 또는 동적 (2)).

char l[3]; /* (1) */ 

#include <stdlib.h> 
char *l = malloc(3); /* (2) */ 

strcpy와 같은 오류는 다음과 같습니다 second는 초기화되지 포인터, 당신은 그것으로 쓸 수있다. 당신은 Segmentation Fault 오류를 멸시하는 방법을 배웁니다

+0

다른 질문이 생깁니 까? 내가 char * ch를 가지고 있다면; 이것은 자동으로 하나의 문자를 저장하기 위해 하나의 메모리 위치를 할당하겠습니까? – user1684072

+0

아니요, 만약 당신이'char * ch'를 가지고 있다면, 그것은'char'에 대한 포인터에 공간을 할당하고 단위 화 된 상태로 남습니다. 그것은 당신이 캐릭터를 갖고 싶어하고'char ch'라고 선언하십시오. – md5

0

...

당신은 당신 아니라고 메모리에 액세스하려고 할 때 그것은 보통이라고

. 범위를 벗어나는 배열 인덱스에 액세스하려고 할 때 가장 일반적으로 발생합니다.

char *l은 char에 대한 포인터를 생성합니다. 원하는 문자열은 C에서 char 배열로 정의됩니다. 당신은 어떤 l의 메모리의 다음 위치에 액세스하려고 할 때, 당신은 당신이 메모리를 얻을 수 때문에, 당신 아니라고 메모리에 액세스 할 수 Segmentation Fault

0

을 겁니다 (아마 쓰레기가 될 것이다)를 가리키는 malloc을 사용하거나 포인터를 이미 존재하는 변수로 지정하십시오.

*l = 'c'; 
    *(l+1) = 'g'; 
    *(l+2) = '\0'; 

을하지만 지금은 다른 포인터에 복사 할 것인지,이 포인터는 다른 문자열을 가리키는되어야 또는 당신은 그것을 위해 메모리를 할당해야합니다

char word[3]; 
    char *l; 
    l = word; 

지금 당신은 할당 할 수 있습니다.

char *pointer_to_second; 
    char second[3]; 
    pointer_to_second = second; 

또는 3 선을 변경, 동적 메모리를 얻기 위해 원하는 경우 위의이 하나의 울부 짖는 소리가 될 : 당신이 원하는 무엇을 당신이 할 수있는 그 이후

char *pointer_to_second = malloc(sizeof(char) * 3); 

:

strcpy(pointer_to_second, l); 

그러나 C 컴파일러를 사용하는 경우 모든 변수를 처음부터 선언해야합니다. 그렇지 않으면 오류가 발생합니다. C++ 컴파일러를 사용한다면 걱정할 필요가 없습니다.

벡터에 속하지 않는 필드에 액세스하려고하면 세그먼트 오류가 발생합니다. 당신이 3 개 위치를 포인터 때문에,

printf("The value in position 3 of my pointer is %c\n", *(l + 3)); 

당신은 아마 오류가 발생합니다 당신은 4 일을 ACESS하려고 예를 들어, 당신이하려고하는 경우.