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
'IT이야기' 카테고리의 다른 글
"%"가 뭐죠?*s"는 printf의 의미입니까? (0) | 2022.06.20 |
---|---|
왜 모바일에서는 키다운이 작동하지 않는가?버전 2 (0) | 2022.06.19 |
Vue.js 구성 요소 데이터 값을 하위 구성 요소에 전달 (0) | 2022.06.19 |
이 비트 단위 연산은 2의 거듭제곱을 어떻게 확인합니까? (0) | 2022.06.19 |
WebSocket 액세스 중 InvalidStateError가 발생함 (0) | 2022.06.19 |