2014-06-09 6 views
1

저는 C가 처음인데 이제는 액세스 할 수없는 메모리를 사용하려고 시도 할 때 세그먼트 오류가 나타납니다. 그러나 나는 어디서 잘못 가고 있는지 알고 싶지 않다. 어떤 도움을 주시면 감사하겠습니다.포인터를 사용하여 strcat을 수행하는 동안 세그먼트 오류 (코어 덤프)가 발생했습니다.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int main() 
{ 
char *str1 = "United"; 
char *str2 = "Front"; 
char *str3; 

int l1,l2,l3; 
l1 = strlen(str1)+1; 
l2 = strlen(str2)+1; 
l3 = l1 + l2; 

str3 = (char *)malloc(l3); 
str3 = strcat(str1,str2); 

printf("%s\n",str3); 

return 0; 
} 

답변

2

작동합니다 :

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int main() 
{ 
    char *str1 ; 
    char *str2 ; 
    char *str3; 
    int l1,l2,l3; 
    str1 = (char*)malloc(10); 
    str2 = (char*)malloc(10); 
    strcpy(str1,"United"); 
    strcpy(str2,"Front"); 

    l1 = strlen(str1)+1; 
    l2 = strlen(str2)+1; 

    l3 = l1 + l2; 


    str3 = (char *)malloc(l3); 
    str3 = strcat(str1,str2); 

    printf("%s\n",str3); 

    return 0; 
} 
+0

예! 고마워요 : D –

4
str3 = strcat(str1,str2); 

str1 리터럴 문자열로 포인트 당신은 그것을 (수정) 연결할 수 없습니다. 이로 인해 undefined behaviour이 발생합니다.

strcpy(str3,str1); 
strcat(str3,str2); 

str3에는 충분한 메모리가 할당되어야합니다. int main(void) 또는

+0

감사합니다, 점은 주목! 'strcpy (str3, str1);' 'strcpy (str3, str2); ' 은 출력을 Front로, 어떻게 포인터를 사용하여 (출력 : UnitedFront) 연결합니까? –

+0

두번째 것은'strcpy' 대신'strcat'이어야 연결됩니다. – Doraj

+0

@Doraj Thanks. 일반적인 복사 - 붙여 넣기 실수 :) –

3
char *str1 = "United"; 
char *str2 = "Front"; 

int main(int argc, char*argv[]) 메모리와 결정의 읽기 전용 부분에 문자열을 배치합니다 다음 malloc return could be dangerous

사용을 main() 등을위한 표준 프로토 타입을 캐스팅

그리고,

*str1, *str2이 포인터는이 메모리에서 쓰기 작업을 불법으로 만듭니다.

그래서 여기서 *str2이 가리키는 문자열을 정의되지 않은 동작을 일으키는 *str1에 연결하려고합니다. 이

strcpy(str3,str1); 
strcpy(str3+strlen(str3),str2); 

가 대신

+0

고맙다, 요점은 지적했다 :) –

+0

@ NirAvJaIn 당신은 환영합니다. –

+0

+1. 엄밀히 말하면 문자열 리터럴은 읽기 전용 메모리에 저장할 필요가 없습니다. C 표준은 그것을 수정하는 것이 UB라고 말합니다. MMU가없는 시스템은 행복하게 허용합니다. 사전 표준 C에서 수정하는 것이 좋습니다 (유효). –

0

크기 (str1과 +과 str2 + 1)의 버퍼 (STR3)를 가지고있는 것처럼

대신 str3 = strcat(str1,str2);

당신은 할 수 있습니다.

필요한 콘텐츠를 얻으려면 memcpy를 사용하십시오.

memcpy(str3, str1, 6); 
memcpy(str3 + 6, str2, 5); 

문자열의 끝에 null ('\ 0') 값을 추가하십시오. 코드 아래