IT이야기

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

cyworld 2022. 6. 19. 19:37
반응형

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

다음 코드와 함께 "Variable-size 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으로 할당하는 가장 간단한 방법은 루프가 다소 길어도 루프를 사용하는 것입니다.

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

가변 길이 배열은 컴파일 시 컴파일러가 길이를 알 수 없는 배열입니다.고객님의 경우length는 변수입니다.내가 이렇게 결론짓는 이유는 만약length예를 들어 초기화가 작동하는 리터럴 정수로 정의된 프리프로세서 매크로입니다.1989년 최초의 C언어 표준에서는 가변 길이 배열을 허용하지 않았으며, 1999년에 추가되었습니다.그러나 C 표준에서는 이러한 표현을 사용하는 것은 허용되지 않습니다(단, 허용하거나 허용해야 한다고 주장할 수도 있습니다.

변수 배열을 초기화하는 가장 좋은 방법은 다음과 같습니다.

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

memset는 메모리를 초기화하기 위한 매우 빠른 표준 라이브러리 함수입니다(위의 경우 0으로 설정). sizeof(boardAux)에 의해 점유된 바이트 수를 반환합니다.boardAux.sizeof항상 사용할 수 있지만memset필요.#include <string.h>그리고 네-sizeof는 변수 크기의 개체를 인수로 허용합니다.

표준 어레이(가변 길이가 아님)가 있어 메모리를 제로로 초기화하는 것만으로 네스트브래킷이 필요 없는 경우는, 다음과 같이 간단하게 초기화할 수 있습니다.

struct whatEver name[13][25] = {0};

된 되지 않았습니다.시킵니다.variable sized array may not be initialised인 초기화인 '초기화'를 선호한다.

for (i = 0; i < bins; i++)
        arr[i] = 0;

질문은 이미 답변이 끝난 상태이지만, 런타임에 길이를 변경하지 않는 한 빠르고 효과적인 다른 솔루션을 지적하고 싶습니다.macro #define을 main() 앞에 사용하여 길이를 정의합니다.main()에서는 초기화가 동작합니다.

#define length 10

int main()
{
    int boardAux[length][length] = {{0}};
}

매크로는 실제 컴파일 전에 실행되며 길이는 컴파일 시간 상수입니다(David Rodriguez가 답변에서 언급).실제로는 컴파일 전에 길이를 10으로 대체한다.

int size=5;
int ar[size ]={O};

/* This  operation gives an error -  
variable sized array may not be 
initialised.  Then just try this. 
*/
int size=5,i;
int ar[size];
for(i=0;i<size;i++)
{
    ar[i]=0;
}

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

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

반응형