2017-12-22 43 views
-1
#include<stdio.h> 
#define ASIZE 50 
void Reverse(char *str){ 
    int Asize,i=0; 
    char temp; 
    // Find the length of the string 
    while(*(str+i)!='\0'){ 
      i++; 
    } 
    Asize=i; 
    // string reverse 
    for(i=0;i<(Asize/2);i++){ 
       temp = *(str+i); 
       //may be below is some error with first input method 1 
       //but for input method 2 it works perfectly 
       *(str+i) = *(str+(Asize-(i+1))); 
       *(str+(Asize-(i+1))) = temp; 
    } 
} 
int main() 
{ 
    //input method 1. (error aries while i pass the pointer as argument) 
    char *s = "abcxyz"; 
    //input method 2 (works perfectly while as function parameter) 
    char s[ASIZE]; 
    scanf("%s",s); 

    Reverse(s); 
    printf("%s",s); 
} 

주 입력 방법 1에서는 문자열의 반대로 완벽하게 작동하지 않지만 방법 2는 작동합니다. char 포인터의 메모리 표현으로 내 개념이 명확하지 않습니다. 어쩌면 내가 질문을 올바르게하는 것이 좋지 않지만 누군가 제게 방법 1이 효과가없는 이유를 분명히 해 주시겠습니까? 도움에 미리 감사드립니다.문자 유형 포인터 메모리 할당?

+1

문자열 상수를 수정하는 것은 정의되지 않았습니다. –

+0

@ n.caillou GCC는이 경우 경고를 발행하는'-Wwrite-strings' 옵션을 가지고 있습니다. –

답변

-1

"abcxyz" 실제로 const char[7] 유형입니다 수 붕괴 특정 상황에서 const char* A와.

아니요a char* 유형입니다. 문자열을 수정하려고 할 때의 동작은 이며 정의되지 않음은입니다.

은 자동 저장 기간이있는 char의 배열입니다. 당신이 원하는대로 요소를 자유롭게 수정할 수 있습니다.

+0

죄송합니다. 나는 malloc을 원했다. 'char * s = malloc (30); strcpy (s, "abcxyz"); ' –

+1

이렇게 명백한 사본에 답하는 대신, 중복 된 것에 대해 가까운 투표를하십시오. [C tag wiki] (https://stackoverflow.com/tags/c/info), FAQ 섹션에서 표준 목록을 빠르게 찾을 수 있습니다. "문자열"아래에는이 질문을 닫는 데 사용할 수있는 두 가지 유형이 있습니다. – Lundin

+1

@ Lundin. 나는 그것에 동의하지 않는다. 그 이유는 OP가 제출 한 코드에 상당히 깊숙이 묻혀 있기 때문입니다. SO는 "정확한 복제물"이 의미하는 바를 아직 공감대를 얻지 못하고있다. 개인적으로 중복 대상 * 질문 *이 일치하는 경우 질문을 중복으로 닫습니다. – Bathsheba