2011-02-05 4 views
1

구조체를 C로 만들고 고정 크기로 설정되지 않은 배열에 추가하려는 경우 배열은 어떻게 만듭니 까?C 구조체의 배열

사용자 입력을 얻는 동안 모든 반복에서 사용되는 tempStruct를 만들 수 있으며 항상이 배열에서 동일한 tempStruct 구조체를 사용합니까?

사용자 입력에 따라 크기가 알려지지 않은 경우 어떻게 배열이 만들어지고 구조체가이 배열에 추가됩니까?

답변

0

예, 입력 중에 tempStruct를 사용하여 나중에 배열에 추가 할 수 있습니다.

배열의 크기를 알 수없는 경우 문제가 발생합니다. 어딘가에서 배열의 크기를 추적해야합니다. 배열의 크기를 추적하기 위해 배열을 변경할 때마다 변경되는 정수 변수 만 있으면됩니다.

struct의 크기를 컴파일 타임에 알 수없는 경우 더욱 복잡합니다. 배열에 실제 구조체 요소를 가리키는 포인터를 저장하거나 배열의 모든 구조체 크기를 추적해야합니다. 이후의 경우에는 배열에서 수동으로 많은 부분을 계산해야합니다. 이것은 매우 효율적인 메모리이지만 오류가 발생하기 쉽고 디버깅하기가 매우 어렵습니다.

확인. 샘플을 사용하여 포인터를 사용하여 구조체를 보유하는 배열을 만들려면 :

struct MyStruct 
{ 
    /* code */ 
} 

main() 
{ 
    counter = 0; 
    struct MyStruct** array = malloc(counter); 
    // Create new Element 
    struct MyStruct myElement; 
    myElement.someData = someValue; 

    // Add element to array: 
    array = realloc(array, sizeof(struct MyStruct*) * (counter + 1); 
    array[counter] = &myElement; 
    counter++; 

    // Create yet another new Element 
    struct MyStruct myElement; 
    myElement.someData = someOtherValue; 
    array = realloc(array, sizeof(struct MyStruct*) * (counter + 1); 
    array[counter] = &myElement; 
    counter++; 

    // Now remove the last element 
    free(array[counter -1]); // may have something more complicated than that, depending on your struct 
    array = realloc(array, sizeof(struct MyStruct*) * (counter - 1); 
    counter--; 
} 

이 코드는 테스트되지 않았습니다!

+0

그래서 포인터를 만들 수 있습니다. struct * tempStruct 그리고 그냥 이렇게 카운터를 사용하여 배열을 추가? – user604550

+0

@ user604550 : "카운터를 사용하는 배열"에 대해 잘 모르시겠습니까? 명확히 해 주시겠습니까? – yankee

+0

@yankee : 오타를 사용하여 "카운터를 사용하여 배열에?" – user604550

0

컴파일 타임에 크기를 알 수없는 경우 데이터 세그먼트 (전역 변수가 저장되어 있음) 또는 스택 (함수 매개 변수와 로컬 변수가있는 위치)이 아닌 힙에 메모리를 할당해야합니다. 저장된). C에서는 malloc과 같은 함수를 호출하여이를 수행 할 수 있습니다.

MyStructType *myArray = (MyStructType *)malloc(numElements * sizeof(MyStructType) 
... do something ... 
free(myArray) 

C++을 사용하는 경우 일반적으로 new [] 및 delete []를 사용하는 것이 좋습니다.

MyStructType *myArray = new MyStructType[numElements] 
... do something ... 
delete [] myArray 

새로운 []은 (는) delete []와 (과) 쌍을 이루어야합니다. 단일 인스턴스를 할당하는 경우 new를 사용하고 delete ("[]"제외). delete []와 delete는 동일하지 않습니다.

또한 C++을 사용하는 경우 STL 벡터를 사용하는 것이 일반적으로 쉽고 안전합니다.

+0

numElements 무엇입니까? 다른 데이터 형식으로 구성된 구조체가있는 경우 – user604550

+0

numElements는 배열에 넣을 요소의 수입니다. – jonmorgan

0

은 C 배열이 우리가 년 전에 배운 것입니다 고정 된 크기로해야 하지만 메모리 할당 기능은 솔루션 당신이 새로운 연산자를 사용하여 C++로

을 찾을 수 있도록 도움이 될 수

int num=0; 
cout<<"please enter the number"<<endl; 
cin>>num; 
int *x=new int[num]; 
for(int i=0;i<num;i++) 
{ 
    cout<<"enter element "<<(i+1)<<endl; 
    cin>>x[i]; 
} 
//do your work 

씨 Fooz 등

언급 된

삭제 []는 new [] 에 의해 할당 된 메모리를 해제하는 데 사용되며 일반적인 예입니다

+0

Im에 대해 C에게 묻기 덕분에 – user604550

+0

그리고 C++에서는 어쨌든'std :: vector'를 사용할 것입니다 ...^_^... – paercebal

0

이전 C89 표준 컴파일러를 사용하는 경우 가변 길이 배열을 사용할 수 없습니다.C99을 사용하면 가변 길이 배열을 만들 수 있습니다. 설명을 위해 : 가변 길이는 배열 길이가 실행 중에 변경 될 수 없다는 것을 의미하지 않습니다. 컴파일하는 동안 값을 수정하는 대신 실행 중에 설정할 수 있음을 의미합니다. 예를 들어

:

CreateArray(const int numberOfElements) 
{ 
     struct MyStruct arrayOfStructs[numberOfElements]; 
} 

이 C99에서 유효하지만 C89입니다. 컴파일러 문서를 확인하십시오.

관련 문제