다음 코드에서 "Variable-sized object may not initialized"오류가 발생하는 이유는 무엇입니까?
int boardAux[length][length] = {{0}};
enum {length = 0xF } ; int boardAux[length][length] = {0};
다음 코드에서 "Variable-sized object may not initialized"오류가 발생하는 이유는 무엇입니까?
int boardAux[length][length] = {{0}};
enum {length = 0xF } ; int boardAux[length][length] = {0};
답변:
C99 컴파일러 (동적 크기 배열 지원)를 사용하고 있다고 가정합니다. 코드의 문제는 컴파일러가 변수 선언을 볼 때 배열에 얼마나 많은 요소가 있는지 알 수 없다는 것입니다 ( length
컴파일 시간 상수가 아닌 컴파일러 오류에서 여기에서도 가정합니다 ).
해당 배열을 수동으로 초기화해야합니다.
int boardAux[length][length];
memset( boardAux, 0, length*length*sizeof(int) );
printf( "%d", boardAux[1][2] )
잘 컴파일됩니다. 컴파일러는 크기를 알고 메모리에서 (1,2) 번째 요소가있는 위치를 알고 있습니다. 동적 할당을 사용하는 경우 배열은 1 차원이므로 직접 계산해야합니다.printf("%d", boardAux[ 1*length + 2 ])
memset
콜 아웃 에서 오류를 지적 해 주셔서 감사 합니다. 방금 수정했습니다.
length
수 static
? C ++ 14에서는 잘 작동합니다.
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;
}
memset
더 간단하고 빠릅니다.
질문은 이미 답변되었지만 런타임에 길이가 변경되지 않는 경우 빠르고 작동하는 또 다른 솔루션을 지적하고 싶었습니다. main () 전에 매크로 #define을 사용하여 길이를 정의하고 main ()에서 초기화가 작동합니다.
#define length 10
int main()
{
int boardAux[length][length] = {{0}};
}
매크로는 실제 컴파일 전에 실행되며 길이는 컴파일 시간 상수가됩니다 (David Rodríguez가 그의 답변에서 참조 함). 실제로 컴파일 전에 길이를 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;
}
C ++의 경우 이와 같은 별도의 선언 및 초기화 ..
int a[n][m] ;
a[n][m]= {0};
넌 못해. C 컴파일러는 스택에서 이러한 복잡한 일을 할 수 없습니다.
힙 및 동적 할당을 사용해야합니다.
정말로해야 할 일 :
* access (boardAux, x, y, size) = 42를 사용하여 행렬과 상호 작용합니다.