2011-04-05 9 views
-2

그래서 연속으로 이틀에 걸쳐 박기하고 문제가있는 것입니다 :문제 메모리를 복사 할 때

(tuple1 및 tuple2가 무효 포인터가이 함수에 전달되는) 아이디어는 할당하는

char *data; 

data = (char*) calloc (76, 1); 
memcpy(data, tuple1, 32); 
memcpy(data+32, tuple2, 44); 

tuple1tuple2 크기의 합계와 동일한 메모리 (tuple1은 32 바이트이고 tuple2은 44입니다.) tuple1의 32 바이트를 복사하여 데이터 주소에 붙여 넣은 다음 44 바이트의 tuple2을 복사하여 붙여 넣으십시오 데이터의 주소 다음 32 바이트.

tuple1 또는 tuple2 만 복사하면됩니다. 여기에 넣기에는 너무 긴 함수로 데이터를 인쇄하고 있습니다. 그러나 두 개의 메모리 사본을 처음 복사 할 때 memcpy()은 잘 작동하지만 두 번째는 제대로 작동하지 않습니다.

누구든지이 심각한 문제를 해결할 수 있습니까?

+0

당신이해야 설명 무엇에 의해 자체, 일했다. 그러나 표시되지 않은 코드가 작동하지 않을 수있는 이유는 여러 가지가 있습니다. 컴파일되고 실행될 때 문제를 보여주는 완벽한 프로그램을 게시하십시오. 그것이하는 일과 당신이 기대 한 바에 대해 설명합니다. – zwol

+0

증명해보십시오. 설명하는 동작을 표시하는 완전한 프로그램을 표시하십시오 (memcpy 행 중 하나가 주석 처리 된 경우). 데모에 이르기까지 실제 코드를 잘라내는 과정에서 갑자기 다시 작업하기 시작하면 문제가 무엇인지 알려줍니다. –

+0

두 번째 복사본이 작동하지 않는다는 것을 어떻게 알 수 있습니까? 무슨 증거가 있니? – abelenky

답변

1

정렬 및/또는 패딩에 문제가 있다고 의심되는데, 형식 선언은 tuple1tuple2입니다.

정확한 크기를 어떻게 아십니까? 코드가 하드 코드 된 것으로 의심되면 마법 숫자 리터럴이 아닌 sizeof을 사용해야합니다.

또한, 디버깅을 쉽게 작은 무언가로 실험을 시작 C.

에, calloc()
1

를 반환 값을 캐스팅하지 않아야

void* tuple1 = calloc(2, 1); 
char* content1 = "ab"; 
memcpy(tuple1, content1, 2); 

void* tuple2 = calloc(4, 1); 
char* content2 = "cdef";; 
memcpy(tuple2, content2, 4); 

char *data = data = (char*) calloc (6, 1); 
memcpy(data, tuple1, 2); 
memcpy(data+2, tuple2, 4); 

printf("%.*s\n", 6, data); // should print: abcdef 
+0

일부 데이터가 문자열 인 것처럼 가장 할 경우 null 종결 자의 존재 여부를 고려해야합니다. 힌트 :'printf ("%. * s \ n", 6, data); ' – pmg

+0

사용 해 주셔서 감사합니다. – karlphillip

+0

그래서 재미있는 것을 발견했습니다. 데이터에 84 바이트를 할당했습니다. 나는 첫 번째 메모리 사본을 만들고있다 memcpy (data, tuple1, 44); tuple1의 주소에서 데이터의 주소까지 44 바이트를 복사하고 데이터를 읽으려고하면 처음 44 바이트의 데이터에서 tuple1의 바이트를 복사 한 다음 다시 44 바이트의 tuple1 데이터에 대해 할당 된 바이트 수를 채울 때까지. 왜 그랬니?! 어떻게 그것을 막을 수 있습니까? –

관련 문제