2010-11-25 2 views
3

나는 C++의 배열에 대해 스스로에게 질문을 던졌다. 글쎄, 우리는 모두 배열이 고정 된 콜렉션이라는 것을 알고 있습니다. 배열을 정의 할 때 배열 길이를 선언해야하기 때문에 fixed라고 말합니다. 음, 예를 살펴 보자 :배열 크기 다루기

char myarray[10] = {'\0'}; 
int sz = sizeof(myarray); // It is supposed to be 10 

음, 정확, (10)는 sizeof에 의해 반환되는 숫자입니다. 변수에 얼마나 많은 공간이 있는지 알기 때문에 컴파일러가이를 수행 할 수 있습니다.

지금이 상황에서 무슨 생각 :

void dosome(mystruct* arr) { 
    int elements = sizeof(arr)/sizeof(mystruct); 
    for (int i = 0; i < elements; i++) { 
     // Do something hoping no overflow will ever occur 
    } 
} 

니스 ...하지만 나는 그것이 오버 플로우 경향이있을 수 있다고 생각. 나는이 함수에 나는 "일반적인"방법으로 생성 된 배열을 전달하면 아무런 문제 될 것이 없다 :

mystruct array[20]; 
dosome(array); 

없음 문제. 하지만이 작업을 수행 할 경우 :

어떻게됩니까
mystruct* array = (mystruct*)malloc(80*sizeof(mystruct)); 
dosome(array); 

??????????????????? sizeof가 작동하는 방식을 이해하고 싶습니다.이 함수는 컴파일 타임에 평가됩니다. ??? 좋아요. 배열을 사용하면 어떻게됩니까?하지만 그와 같은 데이터 블록처럼 매우 성가신 무엇입니까? 또한, malloc에 ​​대한 또 다른 호출을 realloc하여 doslob에 해당 데이터 블록을 다시 처리하도록 요청할 수 있습니다. 작동할까요? 신체적으로 시도해 볼 수도 있지만 sizeof의 행동에 대한 정확한 대답을 얻을 수 있습니다.

감사합니다.

+2

주의'를 sizeof (편곡)는''를 sizeof (* MYSTRUCT)'에 관계없이 C에서 개발하는 경우 함수가 – icecrime

+0

라고 방식 ++입니다, 가능할 때마다'malloc' 대신'new'를 사용하십시오.'mystruct * array = new mystruct [20];'와 같이 배열을 정의하면 여전히 코드가 잘못 작동합니까? – suszterpatt

+0

icecrime이 맞다, 당신이 틀린 기대를 가지고있다 – Simone

답변

1
void dosome(mystruct* arr) { 
    int elements = sizeof(arr)/sizeof(mystruct); 
    for (int i = 0; i < elements; i++) { 
     // Do something hoping no overflow will ever occur 
    } 
} 

이 예에서 arr에는 어떤 유형이 있습니까? mystruct*! 크기는 4 또는 8 일 가능성이 큽니다. new/d가 아닌 정적으로/자동으로 할당 된 배열을 트릭이 작동하도록 크기를 유지하는 함수에 전달하려면 REFERENCE를 전달하십시오!

template <int N> 
void dosome(mystruct (& arr) [N]) { 
    for (int i = 0; i < N; i++) { 
     // Do something . No overflow will occur 
    } 
} 

는 또한 dosome``에서이

int a[20]; 
sizof a; //equals to 20*sizeof(int) 
int* b = new int [20]; 
sizeof b; //equals to sizeof pointer, most likely 4 
+0

AHHH 알았어. 알고 싶었어. 그래서 ... [20]과 * b ... 컴파일러는 [number] 덕분에 크기를 감지 할 수있다 !! 고맙습니다. – Andry

2

예를 들어 mystruct array[20]부터 시작하는 것은 잘못되었습니다. 함수는 배열 유형이 아닌 포인터 유형을 받기 때문에 배열의 요소 수를 추론 할 수 없습니다. 실제로 sizeof(arr)을 수행하면 mystruct* 크기가됩니다.

당신은 사용하는 템플릿 매개 변수로 배열을 함수를 작성하는 수 있지만, C++에서 제안 된 방법은 내가 잘못 아니에요 경우, vector의를 사용하는 것입니다.

매개 변수 같은 것을 작성하는 것처럼 배열을받을 수있는 "방법" 함수 선언을 수정

template <int N> void somefunction(int (&v)[N]); 

편집을. 죄송합니다.

+1

C++에서 함수에 이런 종류의 것을 전달하는 제안 된 방법은 반복자 쌍을 사용하는 것입니다 :-) 만약 실패하면 (예를 들어 여러분이 작성하는 모든 함수가 템플리트 화되기를 원하지 않는다면), a 벡터가 할 수도 있고, 포인터와 길이 일 수도 있습니다. –

+1

'template void somefunction (int (& v) [N]); – Anycorn

+0

-1 : 함수 선언은 다음과 같습니다.'템플릿 void somefunction (int * v); ' –

0

sizeof는 컴파일 타임 연산자입니다. 그리고 여기에서는 포인터의 크기 만 계산합니다.