티스토리 뷰

Test/C

메모리와 포인터4 : 메모리 복사

kiostory 2018. 12. 20. 22:16

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main(void)
{
 char szSrcBuf[12] = { "Hello" };
 char szDstBuf[12] = { 0 };


 //szSrcBuf =szDstBuf;   안돼! L-value가 배열의 이름으로 곧 주소 상수다. 3=4; 이게 안돼듯이 안돼!
 // 단순히 주소만 복사하는경우(Shallow copy)와 내용을 복사하는 경우(Deep copy)는 다르다.


 // Deep copy!!
 memcpy(szDstBuf, szSrcBuf, sizeof(szDstBuf));


 //------------- 이하 개삽질~!

 char *pszData = malloc(sizeof(char)*12);      // 포인터 변수


 // Shallow copy !!
 pszData = szSrcBuf; // szSrcBuf의 메모리 주소만 메모리 포인터 pszData에 복사

 puts(pszData);      // 메모리 포인터 pszData에 들어있는 주소가 가리키는 szSrcBuf의
                           // 내용을 출력하게 됨. 그럼 동적 할당한 pszData를 free()하게 되면?
                           // 주소가 가리키는 szSrcBuf를 free하려고 하기 때문에 디버깅 에러!

 //------------- 이상 개삽질~!



 return 0;
}

------------------------------------------------------------------------------------------------------




#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main(void)
{
 char szSrcBuf[12] = { "Hello" };
 char szDstBuf[12] = { 0 };


 //szSrcBuf =szDstBuf;   안돼! L-value가 배열의 이름으로 곧 주소 상수다. 3=4; 이게 안돼듯이 안돼!
 // 단순히 주소만 복사하는경우(Shallow copy)와 내용을 복사하는 경우(Deep copy)는 다르다.


 // Deep copy!!
 memcpy(szDstBuf, szSrcBuf, sizeof(szDstBuf));


 if (szSrcBuf == szDstBuf) // 잘 복사되었으면 Same이 출력될것 같지만 주소만 비교하고 있으므로

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  puts("Same");         // 항상 Diff만 출력.  개삽질~!
 else
  puts("Diff");


 return 0;
}

---------------------

제대로 비교하려면

if(memcmp(szSrcBuf, szDstBuf, sizeof(szSrcBuf))==0)

이렇게 비교해야 Deep compare


---------------------------------------------------------------------------------------------------------



* strstr()

> string에서 검색할 문자를 찾음. 찾으면 해당문자열이저장된 메모리 주소 반환, 못찾으면 NULL 반환

ex)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main(void)
{
 char szBuffer[12] = { "I am a boy." };

 char *pszFound = strstr(szBuffer, "am");

 int nIndex = pszFound - szBuffer;


// 문자열에서 문자를 찾은 주소를 빼면 문자열 처음에서 찾은 문자열까지의 거리(index)를 나타냄

// 예제에서 nIndex값은 2가 된다

 


 return 0;
}

-----------------------------------------------------------------------------------------------------



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함