C로 된 큰 배열이 있습니다(차이가 있다면 C++가 아닙니다). 모든 멤버를 동일한 값으로 초기화하고 싶습니다. 나는 한때 이것을하는 간단한 방법을 알고 있다고 맹세 할 수 있습니다. 제 경우에는 memset()
을 사용할 수 있지만 C 구문에 바로 내장되어 있는 방법은 없나요?
해당 값이 0이 아니라면(이 경우 이니셜라이저의 일부를 생략할 수 있으며 의 일부를 생략할 수 있으며 해당 요소가 0으로 초기화됨)가 아니라면 쉬운 방법은 없습니다.
하지만 분명한 해결책이 있다는 것을 간과하지 마세요:
int myArray[10] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
누락된 값이 있는 요소는 0으로 초기화됩니다:
int myArray[10] = { 1, 2 }; // initialize to 1,2,0,0,0...
이렇게 하면 모든 요소가 0으로 초기화됩니다:
int myArray[10] = { 0 }; // all elements 0
C++에서는 빈 초기화 목록도 모든 요소를 0으로 초기화합니다. 이것은 C에서는 허용되지 않음입니다:
int myArray[10] = {}; // all elements 0 in C++
정적 저장 기간이 있는 객체는 지정되지 않은 경우 0으로 초기화됩니다. 이니셜라이저가 지정되지 않으면 0으로 초기화됩니다:
static int myArray[10]; // all elements 0
그리고 '0'이 반드시 '모든 비트가 0'을 의미하는 것은 아니므로, 위의 방법을 사용하는 것이 memset()보다 더 좋고 이식성이 좋습니다. (부동 소수점 값은 0, 널 값에 대한 포인터 등으로 초기화됩니다).
동일한 가치를 여러 복사 붙여 넣기 위한 큰 정적으로 초기화중 어레이에는 매크로 없이 사용할 수 있습니다.
#define VAL_1X 42
#define VAL_2X VAL_1X, VAL_1X
#define VAL_4X VAL_2X, VAL_2X
#define VAL_8X VAL_4X, VAL_4X
#define VAL_16X VAL_8X, VAL_8X
#define VAL_32X VAL_16X, VAL_16X
#define VAL_64X VAL_32X, VAL_32X
int myArray[53] = { VAL_32X, VAL_16X, VAL_4X, VAL_1X };
너 대체 어떻게 해야 할 경우, 값을 변경하십시오 가격은 1 위를 차지했다.
(저작권: [조너선 Leffler] (https://stackoverflow.com/users/15168/jonathan-leffler))
이와 함께 쉽게 일반화할 수 있습니다.
#define VAL_1(X) X
#define VAL_2(X) VAL_1(X), VAL_1(X)
/* etc. */
변형 사용하여 만들 수 있습니다.
#define STRUCTVAL_1(...) { __VA_ARGS__ }
#define STRUCTVAL_2(...) STRUCTVAL_1(__VA_ARGS__), STRUCTVAL_1(__VA_ARGS__)
/*etc */
와 함께 사용할 수 있는 복합 구조 또는 배열입니다.
#define STRUCTVAL_48(...) STRUCTVAL_32(__VA_ARGS__), STRUCTVAL_16(__VA_ARGS__)
struct Pair { char key[16]; char val[32]; };
struct Pair p_data[] = { STRUCTVAL_48("Key", "Value") };
int a_data[][4] = { STRUCTVAL_48(12, 19, 23, 37) };
매크로 이름을 통행할 수 있다.
모든 멤버가 어레이입니다 수 있도록 스케쳐내 initialized) 가 명시적으로 그냥 생략하십시오 치수값이 &solarisdvd 선언:
int myArray[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
컴파일러에서 추론 치수값이 &solarisdvd 초기화 목록. 가장 바깥쪽 치수를 위한 죄송합니다. 다차원 스토리지에만 생략할 수 있습니다.
int myPoints[][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9} };
하지만 정상
int myPoints[][] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9} };
그렇지 않습니다.
내가 본 일부 코드를 사용하는 이 구문은:
char* array[] =
{
[0] = "Hello",
[1] = "World"
};
특히 문제가 되고 있는 유용한 정보기술 (it), re making 배열입니다 이넘 you& # 39 를 사용하여 색인:
enum
{
ERR_OK,
ERR_FAIL,
ERR_MEMORY
};
#define _ITEM(x) [x] = #x
char* array[] =
{
_ITEM(ERR_OK),
_ITEM(ERR_FAIL),
_ITEM(ERR_MEMORY)
};
이렇게 되면 생기는 경우에도 셨으며 쓰기 위해 일부 이넘 값을 out of order.
이에 대해 더 자세히 기법을 korea. [here] [1] 및 here.
[1]: http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp = /com.ibm.xlcpp8l.doc/language/ref/aryin.htm 항목를?
위에서 설명한 대로 정적 이니셜라이저를 모두 사용할 수 있지만 배열 크기가 변경되면 정말 짜증날 수 있습니다(배열이 활성화될 때 적절한 추가 이니셜라이저를 추가하지 않으면 가비지가 발생함).
멤셋은 작업을 수행하기 위한 런타임 히트를 제공하지만, 제대로 수행된 코드 크기 히트는 배열 크기 변경에 영향을 받지 않습니다. 저는 배열이 수십 개의 요소보다 큰 거의 모든 경우에 이 솔루션을 사용했습니다.
배열을 정적으로 선언하는 것이 정말 중요한 경우에는 프로그램을 작성하여 빌드 프로세스의 일부로 만들었습니다.
여기 다른 방법으로:
static void
unhandled_interrupt(struct trap_frame *frame, int irq, void *arg)
{
//this code intentionally left blank
}
static struct irqtbl_s vector_tbl[XCHAL_NUM_INTERRUPTS] = {
[0 ... XCHAL_NUM_INTERRUPTS-1] {unhandled_interrupt, NULL},
};
참조:
[캜 확장명은] [1]
지정된 init
그럼 하나님께용서를 질문: 한 때 사용할 수 있는 C 확장을?
샘플 코드 위에 포함된 시스템 및 다른 컴파일러와의 빛을 볼 수 없을 것입니다.
[1]: # 캜 확장명은 .2/gcc/c-extensions.html http://gcc.gnu.org/onlinedocs/gcc-4.1
빨리 모든 유형의 초기화하려면 어레이입니다 주어진 값과 함께 있습니다. 작동하잖아 잘 았겠습니다 대형 배열입니다. 알고리즘은 다음과 같습니다.
첫 번째 요소에 어레이입니다 초기화하지 (일반적인 방식)
복제본에 디스크입니다. diskid 설정되었습니다 agent. 부품 부품 크기를 두 배로 복사 작업을 통해 다음, 각 설정되었습니다 디스크입니다. diskid 없습니다.
"에 대한 1 000 000 000 연구학자들은 int '어레이입니다 보다 4 배 빠른 것은 일반 루프 초기화하지 (2.3 ghz, 코어, 메모리, 64 비트 4gib tmi5, 2):
[초짜리입니다] '' 루프 런타임용으로 개발하십시오 0.004248
'멤필 런타임용으로 개발하십시오 0.001085 [초짜리입니다]' ()
#include <stdio.h>
#include <time.h>
#include <string.h>
#define ARR_SIZE 1000000
void memfill(void *dest, size_t destsize, size_t elemsize) {
char *nextdest = (char *) dest + elemsize;
size_t movesize, donesize = elemsize;
destsize -= elemsize;
while (destsize) {
movesize = (donesize < destsize) ? donesize : destsize;
memcpy(nextdest, dest, movesize);
nextdest += movesize; destsize -= movesize; donesize += movesize;
}
}
int main() {
clock_t timeStart;
double runTime;
int i, a[ARR_SIZE];
timeStart = clock();
for (i = 0; i < ARR_SIZE; i++)
a[i] = 9;
runTime = (double)(clock() - timeStart) / (double)CLOCKS_PER_SEC;
printf("loop runtime %f [seconds]\n",runTime);
timeStart = clock();
a[0] = 10;
memfill(a, sizeof(a), sizeof(a[0]));
runTime = (double)(clock() - timeStart) / (double)CLOCKS_PER_SEC;
printf("memfill() runtime %f [seconds]\n",runTime);
return 0;
}
아무도 액세스하려면 인덱스화할 언급한 요소들이 초기화되었습니다 어레이입니다. 예를 들어 있는 코드 부여하느뇨 내 설명을 하기 때문이다.
#include <iostream>
void PrintArray(int a[3][3])
{
std::cout << "a11 = " << a[0][0] << "\t\t" << "a12 = " << a[0][1] << "\t\t" << "a13 = " << a[0][2] << std::endl;
std::cout << "a21 = " << a[1][0] << "\t\t" << "a22 = " << a[1][1] << "\t\t" << "a23 = " << a[1][2] << std::endl;
std::cout << "a31 = " << a[2][0] << "\t\t" << "a32 = " << a[2][1] << "\t\t" << "a33 = " << a[2][2] << std::endl;
std::cout << std::endl;
}
int wmain(int argc, wchar_t * argv[])
{
int a1[3][3] = { 11, 12, 13, // The most
21, 22, 23, // basic
31, 32, 33 }; // format.
int a2[][3] = { 11, 12, 13, // The first (outer) dimension
21, 22, 23, // may be omitted. The compiler
31, 32, 33 }; // will automatically deduce it.
int a3[3][3] = { {11, 12, 13}, // The elements of each
{21, 22, 23}, // second (inner) dimension
{31, 32, 33} }; // can be grouped together.
int a4[][3] = { {11, 12, 13}, // Again, the first dimension
{21, 22, 23}, // can be omitted when the
{31, 32, 33} }; // inner elements are grouped.
PrintArray(a1);
PrintArray(a2);
PrintArray(a3);
PrintArray(a4);
// This part shows in which order the elements are stored in the memory.
int * b = (int *) a1; // The output is the same for the all four arrays.
for (int i=0; i<9; i++)
{
std::cout << b[i] << '\t';
}
return 0;
}
출력은:
a11 = 11 a12 = 12 a13 = 13
a21 = 21 a22 = 22 a23 = 23
a31 = 31 a32 = 32 a33 = 33
a11 = 11 a12 = 12 a13 = 13
a21 = 21 a22 = 22 a23 = 23
a31 = 31 a32 = 32 a33 = 33
a11 = 11 a12 = 12 a13 = 13
a21 = 21 a22 = 22 a23 = 23
a31 = 31 a32 = 32 a33 = 33
a11 = 11 a12 = 12 a13 = 13
a21 = 21 a22 = 22 a23 = 23
a31 = 31 a32 = 32 a33 = 33
11 12 13 21 22 23 31 32 33
#include<stdio.h>
int main(){
int i,a[50];
for (i=0;i<50;i++){
a[i]=5;// set value 5 to all the array index
}
for (i=0;i<50;i++)
printf("%d\n",a[i]);
return 0;
}
이 o / p 부여하느뇨 5 5 5 5 5 5. 전체 크기는 어레이입니다 인도되니
내가 알고 있는 것과 유사한 방식으로, 하지만 난 이 질문에 '사용자' 타르스키는 답변됨 몇 차례 더 자세히 설명했다. # 39 m, C 를 그리하면그분께서 내 일부 I& 녹슨 emc. 조금 더 사용할 가능성이 있기 때문에 다시 I& # 39 m, 하지만, 여기에 c++컴파일러는 발표한다.
< hr>;
배열의 크기를 미리 알고 있는 경우.
#include <stdio.h>
typedef const unsigned int cUINT;
typedef unsigned int UINT;
cUINT size = 10;
cUINT initVal = 5;
void arrayInitializer( UINT* myArray, cUINT size, cUINT initVal );
void printArray( UINT* myArray );
int main() {
UINT myArray[size];
/* Not initialized during declaration but can be
initialized using a function for the appropriate TYPE*/
arrayInitializer( myArray, size, initVal );
printArray( myArray );
return 0;
}
void arrayInitializer( UINT* myArray, cUINT size, cUINT initVal ) {
for ( UINT n = 0; n < size; n++ ) {
myArray[n] = initVal;
}
}
void printArray( UINT* myArray ) {
printf( "myArray = { " );
for ( UINT n = 0; n < size; n++ ) {
printf( "%u", myArray[n] );
if ( n < size-1 )
printf( ", " );
}
printf( " }\n" );
}
위에 몇 가지 이다. 한 것은 아니다. '직접' 단위 myArray [크기] 그러나 바로 다음 코드 블록 초기화되었습니다 빛위에 선언 또는 함수 호출에 각 요소에 초기화하지 높여줍니까 같은 값을 스토리지로는 운영까지도. 즉, 다른 단서 조항 '각' 유형 'you' 를 쓰지 않을 수 있는 기능을 지원할 수 있게 초기화중 진실이며당신이 프린타이 이러한 유형 ' ()' 기능을 지원할 수 있도록 수정해야 할 수도 있다는 것이다.
< hr>;
이 코드를 시도할 수 있는 온라인 컴파일러 늑대굴에서 here.
이 경우, 쉼표 연산자 함께 사용할 경우 표현식에서는 짓궂군요 동시에 할 수 있다고 생각한다.
a[1]=1, a[2]=2, ..., a[indexSize];
한 번에 할 수 있는 경우 또는 짓궂군요 chunghwa, for 루프.
for(int index = 0, value = 10; index < sizeof(array)/sizeof(array[0]); index++, value--)
array[index] = index;
이 목록은 평행광 작동자 위에 설명됨 //note 쉼표 연산자 작업공간에서 인수만 않습니다.
데클라티온 어레이에서는 초기화하지 수 있습니다.
array[] = {1, 2, 3, 4, 5};
Call to malloc / / / etc / 알로카 스베르크 calloc 남길 수 있는 스토리지 고정 영역을 할당지 충족되었으며 객체에는:
int *array = malloc(sizeof(int)*numberOfListElements/Indexes);
통해 회원 및 액세스하려면.
*(array + index)
상술합니다.