구조 필드(C)를 할당하면 "error: assignment to expression with array type error"가 나타난다.
저는 초보자 C 프로그래머이며, 어제 C 구조의 사용법과 구체적인 문제 해결에 대한 가능한 적용 방법을 배웠습니다.그러나 C 프로그래밍의 이러한 측면을 배우기 위해 C IDE(Codeblocks 16.01)를 시험하고 있을 때 이상한 문제가 발생했습니다.코드는 다음과 같습니다.
#include <stdio.h>
#define N 30
typedef struct{
char name[N];
char surname[N];
int age;
} data;
int main() {
data s1;
s1.name="Paolo";
s1.surname = "Rossi";
s1.age = 19;
getchar();
return 0;
}
컴파일 중에 컴파일러(Windows의 경우 GCC 4.9.3-1)에서 다음과 같은 오류가 보고되었습니다.
"error: 어레이 유형 오류가 있는 식에 할당"
지시에 따라
s1.name="Paolo"
s1.surname="Rossi"
내가 한다면
data s1 = {"Paolo", "Rossi", 19};
그건 효과가 있다.내가 뭘 잘못하고 있지?
에서 문제가 발생하고 있습니다.
s1.name="Paolo";
왜냐하면 LHS에서는 할당이 불가능한 어레이 유형을 사용하고 있기 때문입니다.
상세하게 말하면C11
, 제6.5.16장
할당 연산자는 수정 가능한 l값을 왼쪽 피연산자로 가져야 한다.
그리고 수정 가능한 l값에 관해서는 제6.3.2.1장의
수정 가능한 lvalue는 배열 유형이 없는 lvalue입니다. [...]
를 사용해야 합니다.strcpy()
어레이에 카피합니다.
그렇긴 한데data s1 = {"Paolo", "Rossi", 19};
할당 연산자를 수반하는 직접 할당이 아니기 때문에 정상적으로 동작합니다.여기서는 괄호로 둘러싸인 이니셜라이저 목록을 사용하여 개체의 초기 값을 제공합니다.이는 § 6.7.9에 언급된 초기화의 법칙을 따른다.
각 괄호로 둘러싸인 이니셜라이저 목록에는 현재 개체가 관련되어 있습니다.지정이 없는 경우 현재 객체의 서브오브젝트는 현재 객체의 유형(첨자순서 증가 배열 요소, 선언순서 구조체 멤버 및 유니언의 첫 번째 명명된 멤버)에 따라 초기화됩니다.[....]
typedef struct{
char name[30];
char surname[30];
int age;
} data;
라고 정의한다.data
메모리 블록은 60자에 int의 4를 더한 값이어야 합니다(주 참조).
[----------------------------,------------------------------,----]
^ this is name ^ this is surname ^ this is age
그러면 스택에 메모리가 할당됩니다.
data s1;
과제는 숫자만 복사하고 때로는 포인터도 복사한다.
이것은 실패한다.
s1.name = "Paulo";
컴파일러가 알고 있기 때문에s1.name
64바이트 길이의 구조체의 시작입니다."Paulo"
는 6바이트 길이의 char[]입니다(C 문자열의 말미에 \0이 붙어 있기 때문에).
따라서 문자열에 대한 포인터를 문자열에 할당하려고 합니다.
"Paulo"를 점의 구조물에 복사하려면name
"Rossi"를 구조물에 삽입하여surname
.
memcpy(s1.name, "Paulo", 6);
memcpy(s1.surname, "Rossi", 6);
s1.age = 1;
결국엔...
[Paulo0----------------------,Rossi0-------------------------,0001]
strcpy
일을 \0
이치노
또는 임의의 길이의 char 배열을 가리키는 구조를 정의할 수 있습니다.
typedef struct {
char *name;
char *surname;
int age;
} data;
이렇게 하면
[----,----,----]
이제 구조에 포인터를 채우고 있기 때문에 이 작업이 작동합니다.
s1.name = "Paulo";
s1.surname = "Rossi";
s1.age = 1;
뭐 이런 거
[---4,--10,---1]
여기서 4와 10은 포인터입니다.
주의: ints와 포인터의 사이즈는 다를 수 있습니다.위의 사이즈 4는 32비트입니다.
여기서 다음 예를 확인해 주세요.구조 멤버 접근
올바른 방법은 다음과 같습니다.
strcpy(s1.name , "Egzona");
printf( "Name : %s\n", s1.name);
예를 들어 문자열을 과 같이 .char sample[20];
, . . . . . . . .sample
포인터가 가리키는 값의 변경은 가능하지만 포인터 자체의 값은 변경할 수 없습니다.초기화할 때char sample
sample
가 「」로 되어 있습니다.char* const sample;
"CHANGE: "CHANGE: " 。s1.name="paulo";
실제로 하면 문자열이 나옵니다."paulo"
라는 표현과는 로 채웁니다.s1.name
잘 하려면 다음 코드를 #include <stdio.h> int main() { char name[20]; printf("address of sample:%d address of a random string:%d",name,"paolo"); }
X 및 2개의 는 X의 Y의 2개의 입니다.X자, X자, X자s1.name
의 주소입니다.paulo
X자 Y자형.
값을 변경하려면 strcpy() 함수를 사용합니다.C에서는 문자열에 직접 값을 할당할 수 없기 때문입니다.(할당 불가 에러가 표시됩니다).
strcpy(s1.name, "New_Name");
언급URL : https://stackoverflow.com/questions/37225244/error-assignment-to-expression-with-array-type-error-when-i-assign-a-struct-f
'programing' 카테고리의 다른 글
상태를 완전히 복제하고 Vuex에서 롤백하려면 어떻게 해야 합니까? (0) | 2022.07.10 |
---|---|
구성 요소 vuej 외부에 있는 저장소에 액세스 (0) | 2022.07.10 |
EditText에서 텍스트 끝에 커서를 놓습니다. (0) | 2022.07.10 |
Vue에서 하위 구성 요소의 계산된 속성에 액세스하는 중 (0) | 2022.07.10 |
C에 문자열을 연결하는 방법 중 어떤 방법이 더 효율적입니까? (0) | 2022.07.10 |