programing

구조 필드(C)를 할당하면 "error: assignment to expression with array type error"가 나타난다.

javaba 2022. 7. 10. 11:33
반응형

구조 필드(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.name64바이트 길이의 구조체의 시작입니다."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의 주소입니다.pauloX자 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

반응형