[완료] 2차원 배열의 memcpy, memcmp 함수 사용법
글쓴이: ystory / 작성시간: 월, 2009/12/07 - 11:15오전
입력받은 데이터를 8바이트 단위로 나눠서 2차원 배열로 써먹으려고 해요.
8바이트 단위가 안되면 빈공간은 공백 문자로 채우고요.
typedef unsigned char u8; u8 **a; char b[256]; int size, i, c; scanf("%[^\n]", b); size = strlen(b); while(size % 8 || size == 0) b[size++] = ' '; c = size / 8; a = (u8 **) malloc (sizeof(u8 *) * c); for(i = 0; i < c; i++) a[i] = (u8 *) malloc (sizeof(u8) * 8); /* memcpy(a, &b, size); 1. memcpy(*a, b, size); 2. 이 두가지 모두 생각 한거랑은 다른 결과가 나오네요. 어차피 2차원 배열도 연속된 공간이라 size 만큼 복사 될줄 알았는데 아닌거 같아요. 왜 그런 걸까요? 더블 포인터로 인자를 넣으면 segment fault 1.번 2번의 경우에는 *a 에만 값이 채워지고 나머지는 쓰레기값이네요. 그래서 고민고민하다가 떠올라서 이렇게 해결하긴 했는데 이렇게 하는게 맞나요? */ for(i = 0; i < c; i++) memcpy(*(a+i), b + (i*8), sizeof(u8) * 8);
그럼 답변좀 부탁드려요. 감사합니다.
Forums:
malloc은 메모리의
malloc은 메모리의 연속된 구간을 할당해 주지 않아요
위 코드에서 a[0], a[1], a[2]... 가 포인팅하는 곳은 연속된 메모리 구간이 아니라는 것...
그래서 하단의 for 루프로 값을 넣어줘야 되는거구요
1번은 두 번째 인자때문에 폴트가 나는거지만 첫 번째 인자가 8바이트 데이터 영역이 아닌
데이터 영역의 포인터를 덮어쓰고 있다는 것도 참고하시고요
2번은 a[0]를 8바이트 할당해주고 size만큼 덮어씌우고 있는데요 size를 좀 더 크게 하시면 폴트를 보실테구요
a[0], a[1], a[2]의 값을 찍어보세요
a[0] + 8 == a[1]이 아니라는 것을 알 수 있을거에요
감사합니다.
아하. 저렇게 하는게 맞는거군요.
감사합니다. 이해하는데 많은 도움이 되었습니다. : )
--------------------------------------
으휴
mail@ystory.kr
--------------------------------------
으휴
댓글 달기