2013-07-18 2 views
1

나는 코드를 작성했습니다. 이것은 다음과 같습니다. 컴파일 후분할 오류 런타임 오류

#include<stdio.h> 

#include<string.h> 

int do_print2(char *q[]); 
int main() 
{ 

    char *p[]={"pointervaule","NAM", "JAM", "CALM"}; 
    do_print2(p); 
    return 1; 
} 

int do_print2(char *p[]) 
{ 
    printf("this is print1 char *p \n"); 
    strcat(p[0],"added"); 
    printf("%s\n", (p[0])); 
    return 1; 

} 

, 난 내가 분할 오류를 얻고, 그것을 실행하려합니다. 그 오류의 원인을 배우는데 도움이됩니다. 미리 감사드립니다.

답변

4

코드에서 strcat(p[0],"added"); C에서 불법 인 읽기 전용 메모리에 쓰기를 시도합니다. p[0]은 상수 문자열을 가리 킵니다.

아니요 p은 2 차원 문자 배열이 아닌 char 배열에 대한 포인터입니다.

읽기 : Difference between char* str[] and char str[][] and how both stores in memory? 더 잘 이해하려면 다이어그램과 코드 예제가 포함 된 답변을 참조하십시오.

+0

이 HII Grijesh 차우, 첫째 정말이 오류를 수정에서 저를 도와 주셔서 완전 감사합니다, 그리고 u는 책을 나에게 알려 주시기 바랍니다 또는 포인터와 문자열을 다루는 데 편안함을주는 물질적 인 종류의 물건. (자습서는?) –

+0

@SrinivasThanneeru 거대한 목록 : [The Definitive C Book Guide and List] (http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list) [포인터] (http://stackoverflow.com/questions/tagged/pointers) –

+0

@SrinivasThanneeru C에서 코드를 작성해야하는 경우 he/she는 [FAQ] (http://c-faq.com/)를 정기적으로 읽어야합니다 –

3

OS는 C 문자열이 개체의 읽기 섹션에 있다고 (즉 쓰기 금지) 말합니다.

"bla bla"는 실제로는 const char * const 데이터 유형이지만 C 컴파일러의 눈에서 몇 십대의 상호 의존성을 벗어날 수 있습니다. 그러나 교장 (OS)은 용서를 덜하고 회랑에서 그러한 코드의 실행을 추방합니다. (그 진술에서 얼마나 많은 은유들).

+0

'C'에서 문자열 리터럴의 타입은'char [N]'입니다. 그것은 포인터가 아니라 배열이지만, 타입에는'const'가 없습니다. 'gcc'를 사용하면 컴파일러가 문자열 literal을''const char * ''로 처리 할 수 ​​있습니다. '-Wwrite-strings' 옵션은 그렇게 할 것입니다. ** 표준이 아닌 ** C이지만 코드를 더욱 강력하게 만드는 것이 유용합니다. –

+0

나는 그것이 코드의 읽기 섹션에 있다는 것을 의미했다. 즉 스택에 없다. –

+0

Ok는 단지 이것에 대해 알려주기를 원한다. (C++의 문자열 리터럴이'const char *'이기 때문에) 어떤 사람들은 이것을 인식하지 못하고 c와 C++를 혼동한다. Btw에 두 번째 파라 라인이 있습니다. –

1
당신은 전용 메모리,이 할 수있는 더 좋은 방법 읽고 쓸 수 없습니다

:

#include<stdio.h> 

#include<string.h> 

int do_print2(char q[][20]); 
int main() 
{ 
    char p[4][20] = {{0}, {0}, {0}, {0}}; 
    strcat(p[0],"pointervaule"); 
    strcat(p[1],"NAM"); 
    strcat(p[2],"JAM"); 
    strcat(p[3],"CALM"); 
    do_print2(p); 
    return 1; 
} 

int do_print2(char p[][20]) 
{ 
    printf("this is print1 char *p \n"); 
    strcat(p[0],"added"); 
    printf("%s\n", (p[0])); 
    return 1; 

}