2013-06-14 4 views
7
int main() 
{ 
     char *x = "HelloWorld"; 
     char y[] = "HelloWorld"; 

     x[0] = 'Z'; 
     //y[0] = 'M'; 

     return 0; 
} 

위의 프로그램에서 HelloWorld은 읽기 전용 섹션 (즉, 문자열 테이블)에 있습니다. x은 해당 읽기 전용 섹션을 가리키므로 해당 값을 수정하려는 것은 정의되지 않은 동작입니다.문자열의 함수 매개 변수

그러나 y은 스택에 할당되며 HelloWorld은 해당 메모리로 복사됩니다. y를 수정하면 잘 작동합니다. 다음 프로그램에서

, 내용이 변경되었을 경우 모두 char *arrchar arr[] 원인 세그먼트 오류 : String literals: pointer vs. char array

여기 내 질문입니다.

void function(char arr[]) 
//void function(char *arr) 
{ 
    arr[0] = 'X'; 
}   
int main() 
{ 
    function("MyString");  
    return 0; 
} 
  1. 는 함수 매개 변수의 맥락에서의 차이점?
  2. 함수 매개 변수에는 메모리가 할당되지 않습니다 ??

지식을 공유하십시오.

+0

가능한 [매개 변수로 전달 된 배열의 크기] (http : // stackoverflow.com/questions/1328223/sizeof-array-as-parameter) – delnan

+2

배열 매개 변수의 크기에 대한 설명과 관련이 없습니다. 이것은 문자열 리터럴과 문자 배열의 상수에 관한 것이며, 문자 배열은 크기와 거의 관련이 없습니다. –

답변

17

char arr[]char *arr과 절대적으로 동일하므로 정의 쌍과 선언 쌍은 동일합니다.

void function(char arr[]) { ... } 
void function(char *arr) { ... } 

void function(char arr[]); 
void function(char *arr); 

문제는 호출 컨텍스트입니다. 함수에 문자열 리터럴을 제공했습니다. 문자열 리터럴은 수정할 수 없습니다. 함수가 문자열 리터럴을 수정하려고 시도했습니다. 귀하의 프로그램이 정의되지 않은 동작을 호출하고 충돌했습니다. 모두 완벽하게 정결하게.

문자열 리터럴을 마치 static const char literal[] = "string literal"; 인 것처럼 취급하고 수정하지 마십시오.

+0

올바른 저장 기간을 갖기 위해'static const char'라고 말할 수도 있습니다. – ouah

+0

True ... 일치하도록 업데이트하겠습니다 ... –

+1

사실 C++ 표준은 문자열 리터럴이 'const'임을 지정합니다. 불행하게도 C 표준은 그렇지 않습니다. 아마도이 리터럴을 수정하지는 않았지만 너무 많은 레거시 코드를 깨뜨릴 수 있기 때문입니다. – microtherion

6
function("MyString"); 

는 문자열 리터럴 두 경우 모두에 있고 두 경우 모두 문자열이 불가능한입니다

char *s = "MyString"; 
function(s); 

"MyString" 유사하다.

function("MyString"); 

는 인수로 function 리터럴 문자열의 주소를 전달합니다.

+0

첫 번째 경우에도 'HelloWorld'는'char arr []'경우에만 문자열 리터럴입니다. 권리?? – Jeyaram

+1

첫 번째 코드 단편에서 'y'의 문자열 리터럴은 스택에 복사되는 초기화 프로그램입니다. 함수가 여러 번 호출 된 경우 각 호출에서 배열이 초기화되며 아마도 다른 곳의 상수 초기화 기가 사용됩니다. 배열은 수정할 수 있습니다. –

1

char * arr; 위의 명령문은 arr이 문자 포인터이고 한 문자 또는 문자 스트링을 가리킬 수 있음을 의미합니다.

& char arr []; 위의 명령문은 arr이 문자열이며 가능한 한 많은 문자를 저장할 수 있지만 항상 '\ 0'문자로 계산하므로 문자열이됩니다. (예 : char arr [] = "a"는

그러나 호출 된 함수의 매개 변수로 사용되면 전달 된 문자열은 공식 인수에 문자별로 저장되어 아무런 차이가 없습니다. char [] = { 'a', '\ 0'}