2013-07-25 3 views
0

배열을 동적으로 할당하기 위해 malloc을 사용하려고합니다. 내가 사용한 후에는 한 요소의 배열로 끝난다. 코드는 다음과 같습니다 :단일 요소 배열을 반환하는 Malloc

uint8_t *arraystuffs; 
uint16_t update_size; 
//at somepoint, update_size get set to 2448 

arraystuffs = (uint8_t *) malloc(update_size); 

그런 다음 배열에 물건을 할당하려고합니다. 디버거를 살펴보면 값이 0x58 인 1 요소 배열 만 있습니다. 위와 같이 malloc을 여러 번 사용했는데 갑자기 작동하지 않습니다. malloc이 어떻게 작동해야하는지 몇 가지 온라인 예제를 두 번 확인해 보았습니다.

50과 같이 update_size에 더 작은 값을 사용하려했지만 문제가 해결되지 않았습니다.

나는 형체 변환을 시도했지만 그 역시 도움이되지 않습니다.

Keil IDE의 stm32F4 MCU에서 작업하고 있습니다. 어떤 통찰력?

+1

사이드 노트 : C에서 "malloc"결과의 캐스트는 불필요하며 심지어 위험합니다. http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc을 참조하십시오. – hivert

+1

배열을 어떻게보고 있습니까? uint8_t가 디버거에서 문자열로 해석되고 배열의 두 번째 위치가 0이면 디스플레이가 'nul'에서 잘립니다. 메모리 덤프를 사용하여 'arraystuffs'가 가리키는 메모리를 확인합니다. – KeithSmith

+0

코드가 정상적으로 보입니다. 'malloc'이 초기화되지 않은 메모리를 돌려 주므로 배열의 초기 내용을 예측할 수 없다는 것을 기억하고 있습니까? 'arraystuffs [1] ... arraystuffs [update_size-1]에 쓰려고하면 어떻게됩니까? – simonc

답변

3

디버거가 배열의 실제 길이를 알지 못하기 때문입니다. 디버거의 관점에서 arraystuffs은 단순히 포인터입니다. 그것이 하나의 요소만을 보여주는 이유입니다.

표시 한 코드에 아무런 문제가 없으므로 프로그램이 예상 한대로 작동하지 않으면 문제가 다른 곳에 있습니다.

+0

전화하세요. 디버거가 나에게 적절한 크기의 배열을 보여주지 못했습니다. 얼마나 이상합니다. –

+0

이상하지 않습니다. 디버거는 arraystuffs가 가리키는 메모리 양을 알아야합니까? 모든 malloc()은 포인터를 반환했습니다. 포인터가 메모리 블록을 가리키고 있다는 것을 알았습니까? 디버거는 무엇입니까? 당신은 arraystuff를 선언하지 않았습니다 [20]. 당신은 * arraystuff를 선언했습니다. – KeithSmith

-1

내 경험에 항상 기억 공간을 요구할 때 당신이 가지고있는 아이템의 양을 곱하여 저장하려고하는 크기를 넣는 것이 좋습니다. 예를 들어 int 배열을 원한다면 다음과 같이하면됩니다 :

int * my_ints; my_ints = (int *) malloc (20 * sizeof (int));

arraystuffs = (uint8_t *) malloc (update_size * sizeof (uint8_t));

+0

감사합니다. 이미 해당 구성을 시도했습니다. 여송연. –

+0

나는 코드에 뭔가 다른 것이 있다고 생각한다. update_size 값이 변경되지 않았는지 확인하십시오. – Jiminion

+0

[malloc의 결과를 캐스팅하지 마십시오] (http://stackoverflow.com/a/605858/249237). – Kninnug