2012-05-20 1 views
2

나는이 모든 것을 함께 실행하기 시작했다.
그래서 나는 Valgrind의 오류 받고 있어요 :문자 배열을 올바르게로드합니까?

==25468== Invalid write of size 4 
==25468== at 0x52CF64D: _IO_vfscanf (vfscanf.c:1857) 
==25468== by 0x52D730A: __isoc99_fscanf (isoc99_fscanf.c:35) 
==25468== by 0x402DDB: loadMindRAW (gplib.c:172) 
==25468== by 0x4047EE: loadAgent (gplib.c:739) 
==25468== by 0x4048BD: loadAgentsFromFile (gplib.c:799) 
==25468== by 0x4010C3: initRound (gpfight.c:220) 
==25468== by 0x400EBE: main (gpfight.c:99) 
==25468== Address 0x584388d is 253 bytes inside a block of size 256 alloc'd 
==25468== at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 

을 그리고 여기에 가해자의 :

void loadMindRAW(FILE* f_file, unsigned char* mind) 
{ 
    int i; 
    for(i=0; i < MIND_SIZE; i++) 
    { 
     fscanf(f_file,"%d,",&(mind[i])); 
    } 
} 

들어오는 부호 문자 배열이 malloc으로 할당 된 직전 : (MIND_SIZE는 256)

tmpAgent->mind = malloc(MIND_SIZE*sizeof(unsigned char)); 
loadMindRAW(f_file, tmpAgent->mind); 

내 마음의 주소를 정확히 가리키고 있습니까? &(mind[i]) 조금 kludgy 보였다. 원시 포인터 조작 mind+i도 동일한 동작을합니다. 나는 여기서 간단한 것을 놓치고 있습니까?

+0

인가 : 여기

는 루프를 다시 작성하는 방법입니까? 적절하게 태그하십시오. – dasblinkenlight

+0

아, 알림을 보내 주셔서 감사합니다. – Philip

답변

4

주소를 올바르게 가리키고 있지만 포인터가 있어야하는 위치에 unsigned char에 대한 포인터를 fscanf에 전달할 수 없습니다. 이것은 fscanf%d 지정자를보고 있기 때문에 가변 인수 목록의 해당 위치가 부호가있는 int에 대한 포인터라고 가정하기 때문입니다. C와 C++에서 varargs가 구현되는 방식 때문에 fscanf에는 다른 방법이 없습니다. 이 C 또는 C++에 대한

for(i=0; i < MIND_SIZE; i++) 
{ 
    int tmp; 
    fscanf(f_file,"%d,",&tmp); 
    mind[i] = (unsigned char)tmp; 
} 
+0

허. Lemme는 그것을 시도한다. – Philip

+0

그리고 거기 있습니다. 보스처럼. 고맙습니다. 나는 그것을 2 시간 동안 꼼짝 않고 바라보고 있었다. AHHHHH, 이것이 크기 4 인 이유를 설명합니다. – Philip

+0

C99과 C11의 또 다른 옵션은'fscanf()'형식의 바이트 크기 정수를 지정하는 것입니다 :' "% hhd",' tmp' 변수. –