구조물의 특별한 점은 무엇입니까?
C에서는 함수에서 어레이를 반환할 수 없지만 어레이로의 포인터는 반환할 수 있습니다.하지만 나는 무엇이 특별한지 알고 싶다.structs
어레이가 포함되어 있어도 기능별로 반환할 수 있습니다.
왜?struct
래핑은 다음 프로그램을 유효하게 합니까?
#include <stdio.h>
struct data {
char buf[256];
};
struct data Foo(const char *buf);
int main(void)
{
struct data obj;
obj = Foo("This is a sentence.");
printf("%s\n", obj.buf);
return 0;
}
struct data Foo(const char *buf)
{
struct data X;
strcpy(X.buf, buf);
return X;
}
같은 질문을 하는 더 좋은 방법은 어레이에 특별한 조작이 부가되어 있는 어레이이기 때문에 어레이의 특별한 점은 무엇입니까?struct
s.
포인터로 배열을 전달 및 반환하는 동작은 C의 원래 구현으로 거슬러 올라갑니다.배열은 포인터에 대해 "감쇠"하여 특히 언어를 처음 접하는 사람들 사이에서 상당한 혼란을 일으킵니다.반면 구조는 다음과 같은 기본 제공 유형과 동일하게 작동합니다.int
s,double
s 등. 여기에는 에 내장되어 있는 어레이가 포함됩니다.struct
(복사되지 않는 유연한 어레이 멤버 제외)
우선 인용하자면C11
§ 6.8.6.4,return
스테이트먼트, (내 것을 포함)
만약 a가
return
식이 있는 문이 실행되고 식의 값이 함수 호출식의 값으로 발신자에게 반환됩니다.
구조변수를 반환하는 것은 구조값이 반환되기 때문에 가능합니다(정확합니다).이는 모든 기본 데이터 유형을 반환하는 것과 유사합니다(반환).int
예를 들어)를 참조해 주세요.
한편, 어레이를 반환하는 경우는,return <array_name>
는 기본적으로NOTE 어레이의 첫 번째 요소의 주소를 반환합니다.이 주소는 어레이가 호출된 함수에 대해 로컬일 경우 발신측에서 비활성화됩니다.따라서 이러한 방법으로 어레이를 반환할 수 없습니다.
그래서 TL;DR, 특별한 건 없어요.struct
s, 어레이에 특기가 있습니다.
주의:
견적C11
다시, 제6.3.2.1장 (나의 강조점)
피연산자의 피연산자일 때를 제외하고
sizeof
오퍼레이터,_Alignof
연산자 또는 단항&
operator 또는 배열 초기화에 사용되는 문자열 리터럴입니다.유형 "array of type"을 가진 표현식은 배열 객체의 초기 요소를 가리키며 l값이 아닌 "type" 유형을 가진 표현식으로 변환됩니다. [...]
특별한 것은 없다struct
유형: 어레이 유형에는 특별한 점이 있어 함수에서 직접 반환할 수 없습니다.
A struct
표현은 다른 비배열 유형의 표현과 같이 취급됩니다.이 표현식은 이 값의 값으로 평가됩니다.struct
이런 도 할 수
struct foo { ... };
struct foo func( void )
{
struct foo someFoo;
...
return someFoo;
}
.someFoo
의 가치에 따라 평가하다struct foo
object: 객체의 내용이 함수에서 반환됩니다(해당 내용에 배열이 포함되어 있는 경우에도).
됩니다.이 식이 피연산자가 아닌 경우sizeof
단항식&
하기 위해 은 " of " of "에서 .T
"to "to "to "to "to "T
이 은 첫
따라서 배열 식에 대한 참조는 자동으로 포인터 값으로 변환되므로 함수에서 값별로 배열을 반환할 수 없습니다.
구조체는 기본적으로 데이터 구성원을 공개하므로 구조체의 경우 기본적으로 데이터에 액세스할 수 있지만 클래스에는 액세스할 수 없습니다.그래서 구조 래핑은 유효합니다.
언급URL : https://stackoverflow.com/questions/36872230/what-is-special-about-structs
'itsource' 카테고리의 다른 글
느린 MYSQL 쿼리, 인덱스 이해 도움말 필요 (0) | 2022.09.16 |
---|---|
JavaScript: 콜백 함수에 파라미터 전달 (0) | 2022.09.14 |
Java RegEx는 대소문자를 구분하지 않습니까? (0) | 2022.09.14 |
com.mysql.jdbc 클래스를 로드하고 있습니다.운전기사님.이것은 권장되지 않습니다.새로운 드라이버 클래스는 'com.mysql.cj.jdbc'입니다.드라이버 (0) | 2022.09.14 |
PHP에서 1달러 금액으로 숫자를 포맷하려면 어떻게 해야 합니까? (0) | 2022.09.14 |