반응형
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를 사용하여 행렬과 상호 작용합니다.
반응형
'Nice programing' 카테고리의 다른 글
Gradle을 사용하여 aar 라이브러리에 대한 전이 종속성이 해결되지 않았습니다. (0) | 2020.10.05 |
---|---|
새로운 랜덤 라이브러리가 std :: rand ()보다 나은 이유는 무엇입니까? (0) | 2020.10.05 |
git 로그 그래프 읽는 방법 (0) | 2020.10.05 |
서명 된 git 커밋 확인 중? (0) | 2020.10.05 |
spec / rails_helper.rb는 spec / spec_helper.rb와 어떻게 다릅니 까? (0) | 2020.10.05 |