C에서 어레이 선언 및 초기화
먼저 선언한 후 C에서 어레이를 초기화하는 방법이 있습니까?
지금까지 다음과 같은 어레이를 초기화했습니다.
int myArray[SIZE] = {1,2,3,4....};
하지만 난 이런 걸 해야 해
int myArray[SIZE];
myArray = {1,2,3,4....};
에서는 복합 과 C99의 조합으로 수.memcpy
memcpy(myarray, (int[]) { 1, 2, 3, 4 }, sizeof myarray);
(소스 사이즈와 타깃 사이즈가 같은 것을 확인합니다).
C89/90에서는, 추가의 「소스」어레이를 선언하는 것으로, 에뮬레이트 할 수 있습니다.
const int SOURCE[SIZE] = { 1, 2, 3, 4 }; /* maybe `static`? */
int myArray[SIZE];
...
memcpy(myarray, SOURCE, sizeof myarray);
아니요, 선언의 일부로 수행되지 않는 한 하나의 문에서 임의 값으로 설정할 수 없습니다.
다음과 같은 코드로 실행할 수 있습니다.
myArray[0] = 1;
myArray[1] = 2;
myArray[2] = 27;
:
myArray[99] = -7;
또는 (공식이 있는 경우):
for (int i = 0; i < 100; i++) myArray[i] = i + 1;
다른 방법으로는 선언 시 설정된 일부 템플릿을 사용하여 다음과 같이 어레이를 초기화할 수 있습니다.
static const int onceArr[] = { 0, 1, 2, 3, 4,..., 99};
static const int twiceArr[] = { 0, 2, 4, 6, 8,...,198};
:
int myArray[7];
:
memcpy (myArray, twiceArr, sizeof (myArray));
이 기능은 (대부분) 속도가 빠르다는 장점이 있으며 템플릿보다 작은 어레이를 만들 수 있습니다.에.memset
를 참조해 주세요.
초기화 기능으로 현지화할 수도 있습니다.
void initMyArray (int *arr, size_t sz) {
static const int template[] = {2, 3, 5, 7, 11, 13, 17, 19, 21, ..., 9973};
memcpy (arr, template, sz);
}
:
int myArray[100];
initMyArray (myArray, sizeof(myArray));
. 이 어레이는 컴파일 시에 됩니다.memcpy
과제문 1,229장보다 빠를 가능성이 높지만, 확실히 타이핑은 적게 해야 합니다. :-)
먼저 선언한 후 C에서 어레이를 초기화하는 방법이 있습니까?
있습니다! 하지만 당신이 설명한 방법을 사용하지 않습니다.
쉼표로 구분된 목록으로 초기화할 수 없습니다. 이는 선언에서만 허용됩니다.단, 다음과 같이 초기화할 수 있습니다.
myArray[0] = 1;
myArray[1] = 2;
...
또는
for(int i = 1; i <= SIZE; i++)
{
myArray[i-1] = i;
}
이는 AndreyT가 수용한 답변의 부록으로, 어레이 사이즈의 불일치에 대한 Nyan의 코멘트를 기재하고 있습니다.5번째 요소를 0으로 자동 설정하는 것에 동의하지 않습니다.5 ---1,2,3,4 뒤의 숫자입니다.따라서 크기가 다른 배열을 복사하려고 할 때 컴파일 시간 오류를 생성하기 위해 memcpy()에 래퍼를 제안합니다.
#define Memcpy(a,b) do { /* copy arrays */ \
ASSERT(sizeof(a) == sizeof(b) && /* a static assert */ \
sizeof(a) != sizeof((a) + 0)); /* no pointers */ \
memcpy((a), (b), sizeof (b)); /* & unnecesary */ \
} while (0) /* no return value */
어레이의 길이가 1인 경우 이 매크로는 컴파일 시간 오류를 생성합니다.그게 아마 특징일 겁니다.
매크로를 사용하고 있기 때문에 C99 복합 리터럴에는 다음과 같은 추가 괄호 쌍이 필요한 것 같습니다.
Memcpy(myarray, ((int[]) { 1, 2, 3, 4 }));
여기서 ASSERT()는 'static assert'입니다.아직 자신의 플랫폼이 없는 경우 여러 플랫폼에서 다음을 사용합니다.
#define CONCAT_TOKENS(a, b) a ## b
#define EXPAND_THEN_CONCAT(a,b) CONCAT_TOKENS(a, b)
#define ASSERT(e) enum {EXPAND_THEN_CONCAT(ASSERT_line_,__LINE__) = 1/!!(e)}
#define ASSERTM(e,m) /* version of ASSERT() with message */ \
enum{EXPAND_THEN_CONCAT(m##_ASSERT_line_,__LINE__)=1/!!(e)}
왜 신고할 때 초기화가 안 돼요?
어떤 C 컴파일러를 사용하고 있습니까?C99를 지원합니까?
C99가 지원되는 경우 필요한 곳에 변수를 선언하고 선언할 때 초기화할 수 있습니다.
그렇게 하지 않은 것에 대해 생각할 수 있는 유일한 변명은 사용하기 전에 선언을 해야 하지만 조기 종료가 필요하기 때문에 이니셜라이저가 낭비되기 때문입니다.다만, 그러한 코드는, 필요한 만큼 깔끔하게 정리되어 있지 않고, 작성도 가능하기 때문에 문제가 되지 않는다고 생각합니다.
OP는 질문에서 몇 가지 중요한 정보를 생략하고 답변에 대한 코멘트만 달았다.
선언 후 초기화해야 합니다.조건에 따라 다르기 때문입니다.즉, myArray에서 다음과 같은 것을 의미합니다.SIZE]; if(condition1) {myArray{x1, x2, x3, ...} } else if ( condition 2) { myArray {y1, y2, y3, ...} } . . 등입니다.
따라서 가능한 어레이는 모두 데이터에 저장해야 하기 때문에 memcpy는 필요 없고 포인터와 2D 어레이만 필요합니다.
//static global since some compilers build arrays from instruction data
//... notably not const though so they can later be modified if needed
#define SIZE 8
static int myArrays[2][SIZE] = {{0,1,2,3,4,5,6,7},{7,6,5,4,3,2,1,0}};
static inline int *init_myArray(_Bool conditional){
return myArrays[conditional];
}
// now you can use:
//int *myArray = init_myArray(1 == htons(1)); //any boolean expression
삽입되지 않은 버전에서는 다음과 같은 어셈블리가 x86_64에서 제공됩니다.
init_myArray(bool):
movzx eax, dil
sal rax, 5
add rax, OFFSET FLAT:myArrays
ret
myArrays:
.long 0
.long 1
.long 2
.long 3
.long 4
.long 5
.long 6
.long 7
.long 7
.long 6
.long 5
.long 4
.long 3
.long 2
.long 1
.long 0
추가 조건/배열을 위해서는 myArrays의 2를 원하는 수로 변경하고 유사한 로직을 사용하여 올바른 배열로 포인터를 가져옵니다.
초기화 후 어레이에 값을 한꺼번에 할당할 수 없습니다.최선의 대안은 루프를 사용하는 것입니다.
for(i=0;i<N;i++)
{
array[i] = i;
}
하드코드로 다음과 같은 값을 할당할 수 있습니다.array[0] = 1
기타 등등.
데이터가 이미 배열에 저장되어 있는 경우에도 Memcpy를 사용할 수 있습니다.
어레이를 한 번 선언한 후 어레이를 초기화할 수 있는 특별한 방법은 없습니다.
세 가지 옵션만 있습니다.
1) 다른 행으로 초기화합니다.
int array[SIZE];
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
//...
//...
//...
하지만 그건 네가 원하는 게 아닌 것 같아.
2) for 또는 while loop을 사용하여 초기화합니다.
for (i = 0; i < MAX ; i++) {
array[i] = i;
}
이것이 당신의 목표를 달성하기 위한 최선의 방법입니다.
3) 어레이 자체를 1줄로 초기화해야 하는 경우에는 적어도 초기화를 사용하여 어레이를 정의해야 합니다.그런 다음 대상 어레이에 복사해도 아무런 이점이 없다고 생각합니다.이 경우 어레이 자체를 한 줄로 정의하고 초기화해야 합니다.
구체적으로 왜 그렇게 하고 싶은지 물어봐도 될까요?
언급URL : https://stackoverflow.com/questions/3137671/declaring-and-initializing-arrays-in-c
'programing' 카테고리의 다른 글
기본적으로 5가 아닌 웹 팩 4를 사용하는 Vue CLI (0) | 2022.09.01 |
---|---|
vuex / nuxtClientInit용 후크가 생성되었습니까? (0) | 2022.09.01 |
마운트된 이벤트에서 vue 구성 요소 데이터 멤버에 값을 할당하는 방법 (0) | 2022.09.01 |
[Vue warn] :생성된 후크 오류: "TypeError: 정의되지 않은 속성을 설정할 수 없습니다" (0) | 2022.09.01 |
Python Flask 서버를 통해 Vue 앱이 로드되지 않음 (0) | 2022.09.01 |