[완료] 2차원 배열의 memcpy, memcmp 함수 사용법

ystory의 이미지

입력받은 데이터를 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);

그럼 답변좀 부탁드려요. 감사합니다.

obbaya의 이미지

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]이 아니라는 것을 알 수 있을거에요

ystory의 이미지

아하. 저렇게 하는게 맞는거군요.
감사합니다. 이해하는데 많은 도움이 되었습니다. : )
--------------------------------------
으휴
mail@ystory.kr

--------------------------------------
으휴

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.