[c] 문자 배열에 문자열 할당

나는 다음과 같이 조금 놀랐다.

예 1 :

예 2 :

두 번째 접근 방식이 작동하지 않는 이유가 궁금합니다. 그것이 (다른 데이터 유형과 함께 작동 함) 당연한 것 같습니까? 누군가가 이것의 논리를 설명해 줄 수 있습니까?



답변

배열을 초기화 할 때 C를 사용하면 배열을 값으로 채울 수 있습니다. 그래서

기본적으로 다음과 같습니다.

그러나 s자유 포인터가 아닌 배열 이기 때문에 할당을 할 수 없습니다. 그 의미

의 포인터 값 할당하는 것입니다 abcd로를 s하지만 당신은 변경할 수 없습니다 s아무 것도 배열을 가리키는되지 않습니다 때문이다.
이것은 할 수 있고 경우에 작업을 수행 sA는 char*– 무엇을 가리킬 수 있습니다 포인터.

문자열을 복사하려면 간단히 strcpy.


답변

C에서 “문자열”과 같은 것은 없습니다. C에서 문자열은 charnull 문자로 끝나는 의 1 차원 배열입니다 \0. C에서는 배열을 할당 할 수 없기 때문에 문자열도 할당 할 수 없습니다. 문자 그대로 “hello”는const char x[] = {'h','e','l','l','o','\0'};

올바른 방법은 다음과 같습니다.

또는 더 나은 방법 :


답변

초기화와 할당은 여기서 동일한 연산자 ( “=”)를 사용하는 두 가지 별개의 작업입니다.


답변

제공 한 예제에서 s는 실제로 2 행이 아닌 1 행에서 초기화됩니다.이 시점에서 명시 적으로 값을 할당하지 않았더라도 컴파일러는 수행했습니다. 2 행에서 할당 작업을 수행하고 있으며 이와 같은 다른 문자 배열에 하나의 문자 배열을 할당 할 수 없습니다. 배열의 각 요소를 할당하려면 strcpy () 또는 일종의 루프를 사용해야합니다.


답변

Sparr의 답변 을 확장하려면

초기화와 할당은 여기서 동일한 연산자 ( “=”)를 사용하는 두 가지 별개의 작업입니다.

다음과 같이 생각하십시오.

InitializeObject, 및 이라는 2 개의 함수가 있다고 가정 해보십시오 AssignObject. 컴파일러가 볼 때 thing = value컨텍스트를 보고 InitializeObjectthing. 그렇지 않으면 대신 호출AssignObject .

일반적으로이 같은 괜찮 InitializeObjectAssignObject 일반적으로 동일한 방식으로 작동합니다. 문자 배열 (및 몇 가지 다른 경우)을 다룰 때를 제외하고는 다르게 동작합니다. 왜 이러나요? 글쎄 그것은 스택 대 힙 등과 관련된 완전히 다른 게시물입니다.

추신 : 제쳐두고, 이런 식으로 생각하면 복사 생성자와 다른 것들을 이해하는 데 도움이 될 것입니다.


답변

다음을 수행 할 수 있습니다.


답변

이미 답변을 받았지만 C / C ++ Facebook 그룹에서 매우 유사한 질문을 한 사람에게 답변을 공유하고 싶었습니다.


배열에는 할당 연산자 기능이 없습니다 *. 이것은 단순히 문자열 리터럴에 char 배열을 할당 할 수 없음을 의미합니다. 왜? 배열 자체에는 할당 연산자가 없기 때문입니다. (* 변경할 수없는 const 포인터입니다.)

배열은 단순히 연속적으로 할당 된 메모리의 영역이며 배열의 이름은 실제로 배열의 첫 번째 요소에 대한 포인터입니다. ( https://www.quora.com/Can-we-copy-an-array-using-an-assignment-operator 에서 인용 )

문자열 리터럴 ( "Hello world"또는 등 "abcd")을 char 배열에 복사하려면 문자열 리터럴의 모든 char 요소를 배열에 수동으로 복사해야합니다.

char s[100]; 이것은 길이가 100 인 빈 배열을 초기화합니다.

이제이 배열에 문자열 리터럴을 복사하려면 strcpy

strcpy(s, "abcd");그러면 문자열 리터럴의 내용이 복사 "abcd"되어s[100] 배열에 됩니다.

이것이 무엇을하는지에 대한 좋은 예가 있습니다.

strcpy이 사용자 지정 문자열 리터럴 복사기 대신 분명히 사용해야 하지만 strcpy기본적으로 작동 하는 방식을 설명하는 좋은 예입니다 .

도움이 되었기를 바랍니다!