Nice programing

C 컴파일 오류 : "변수 크기의 개체를 초기화 할 수 없습니다."

nicepro 2020. 10. 5. 20:53
반응형

C 컴파일 오류 : "변수 크기의 개체를 초기화 할 수 없습니다."


다음 코드에서 "Variable-sized object may not initialized"오류가 발생하는 이유는 무엇입니까?

int boardAux[length][length] = {{0}};

C99 컴파일러 (동적 크기 배열 지원)를 사용하고 있다고 가정합니다. 코드의 문제는 컴파일러가 변수 선언을 볼 때 배열에 얼마나 많은 요소가 있는지 알 수 없다는 것입니다 ( length컴파일 시간 상수가 아닌 컴파일러 오류에서 여기에서도 가정합니다 ).

해당 배열을 수동으로 초기화해야합니다.

int boardAux[length][length];
memset( boardAux, 0, length*length*sizeof(int) );

C 언어에서는 가변 길이 배열에 이니셜 라이저를 사용할 수 없기 때문에이 오류가 발생합니다. 당신이 얻는 오류 메시지는 기본적으로 모든 것을 말합니다.

6.7.8 초기화

...

3 초기화 할 엔티티의 유형은 알 수없는 크기의 배열이거나 가변 길이 배열 유형이 아닌 객체 유형이어야합니다.


이것은 오류를 제공합니다.

int len;
scanf("%d",&len);
char str[len]="";

이것은 또한 오류를 제공합니다.

int len=5;
char str[len]="";

그러나 이것은 잘 작동합니다.

int len=5;
char str[len]; //so the problem lies with assignment not declaration

다음과 같은 방식으로 가치를 입력해야합니다.

str[0]='a';
str[1]='b'; //like that; and not like str="ab";

배열 선언 후

int boardAux[length][length];

초기 값을 0으로 할당하는 가장 간단한 방법은 약간 길어도 for 루프를 사용하는 것입니다.

int i, j;
for (i = 0; i<length; i++)
{
    for (j = 0; j<length; j++)
        boardAux[i][j] = 0;
}

길이를 단점으로 선언하기 만하면됩니다. 그렇지 않은 경우 메모리를 동적으로 할당해야합니다.


C ++의 경우 이와 같은 별도의 선언 및 초기화 ..

int a[n][m] ;
a[n][m]= {0};

넌 못해. C 컴파일러는 스택에서 이러한 복잡한 일을 할 수 없습니다.

힙 및 동적 할당을 사용해야합니다.

정말로해야 할 일 :

  • 필요한 메모리의 크기 (n m sizeof (요소))를 계산 합니다.
  • malloc (size)를 호출하여 메모리를 할당합니다.
  • 접근자를 만듭니다 : int * access (ptr, x, y, rowSize) {return ptr + y * rowSize + x; }

* access (boardAux, x, y, size) = 42를 사용하여 행렬과 상호 작용합니다.

참고 URL : https://stackoverflow.com/questions/3082914/c-compile-error-variable-sized-object-may-not-be-initialized

반응형