메모리와 포인터4 : 메모리 복사
#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;
}
-----------------------------------------------------------------------------------------------------