2016-09-09 2 views
-1

I가 C의 다음 기능 :숯 *의 str`와 '숯 STR []'차이 '문자열의 선언

int TransMinMaj(char *c) 
{ 
    if((*c) >= 'a' && (*c) <= 'z') 
    { 
     *c += 'A' - 'a'; 
     return 1; 
    } 
    else if((*c) >= 'A' && (*c) <= 'Z') 
     return 1; 
    return 0; 

} 

볼 수 있듯이,이 함수 :
1. 반환 한 시험 캐릭터가
2.
3. 그렇지 않으면 대문자 소문자 변환 편지 인 경우, 내가 하 0

(이 편지가 아닌 것을 나타 내기 위해서 (때문에))를 돌려 전달 된 매개 변수 c의 값을 메모리에서 변경하려고하기 때문에 주소로 매개 변수를 전달하도록 선택했습니다.

이제 내 질문에 온다 : 내 기능은 다음 코드가는 가지 테스트 : 지금까지

char str[] = "abcdefg"; 
printf("Before: %s\n", str);  
TransMinMaj(&str[1]); 
printf("After: %s\n", str); 

을, 모든 좋은, 아니 오류, 경고없이. 보시다시피이 테스트에서는 소문자 b (문자열의 두 번째 요소 (문자 배열))을 메모리의 대문자 'B'로 변환합니다. 테스트 코드에게 litte 조금 변경하면

하지만, :

char *str = "abcdefg"; 
printf("Before: %s\n", str);  
TransMinMaj(&str[1]); 
printf("After: %s\n", str); 

이 분할 오류가을 (코어 덤프). 하지만 이유는 모르겠습니다.
1. 선언 char *strchar str[]의 차이점은 무엇입니까 : 그래서 여기
내 질문에 온다?
2. 내 세그먼트 오류는 어디에서 발생합니까?

+0

질문하기 전에 검색을 사용하십시오. 귀하의 질문이 전에 요청되었을 가능성이 큽니다. 이것은 처음부터 물어 왔습니다. – 2501

+0

포인터로 할 수있는 일 : ptr1 = ptr2; 배열과 함께. 포인터를 사용하면 ptr1 ++을 수행 할 수 있습니다. 배열과 함께. 배열을 사용하면 sizeof (array)/sizeof (array [0])를 호출 할 수 있습니다. 그리고 그런 것들 – jurhas

답변

2
char str[] = "abcdefg"; 

char *str = "abcdefg"; 

는 다른 두 가지입니다.

  • 첫 번째로 초기화 된 "abcdefg" 배열이다.

  • 두 번째 것은"abcdefg"문자열 리터럴을 가리키는 포인터입니다. 당신은 문자열 리터럴을 수정하려고 할 때 두 번째 경우

는, 당신은 리터럴 문자열을 수정하려는 시도로, undefined behavior를 호출 UB이다.

관련 문제