336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

개념 : 


memcpy_s 와 매우 흡사하나 원하는 구역을 복사해서 옴긴다는 개념입니다.


예제의 코드에서 memcpy_s 부분을  memmove_s 함수 이름을 바꿔줘도 결과는


동일합니다. 가독성에 맞게 사용하는것을 권장합니다.



소스코드 : main.c

#include <stdio.h>

#include <string.h>

#include <malloc.h>


int main(void)

{

char *pString = "Hello JunmoZzi";

char *pAdd = " ^^a ha ha ha!";


char *pBuffer = NULL;

int nSize1 = strlen(pString) + 1;

int nSize2 = strlen(pAdd) + 1;

pBuffer = calloc(nSize1 + 1, sizeof(char));


if (pBuffer == NULL)

{

puts("memory 할당 실패");

}

else

{

puts("memory 할당 성공");

printf("메모리 주소 : %d\n", pBuffer);

//strcpy_s(pBuffer, nSize1, pString);

memmove_s(pBuffer, nSize1, pString, nSize1);

}


puts("Run memcmp : pBuffer, pStirng");

if (memcmp(pBuffer, pString, nSize1) == 0)

{

puts("동일한 메모리");

}

else

{

puts("동일하지 않는 메모리");

}


puts(pBuffer);

puts("메모리 재 할당");


realloc(pBuffer, nSize1 + nSize2);

pBuffer[nSize1 - 1] = ' ';// 문자열의 끝 \0을 공백으로 변경


 //strcat_s(pBuffer, nSize1+nSize2, pAdd);

memmove_s(pBuffer + nSize1, nSize2, pAdd, nSize2);

printf("메모리 주소 : %d\n", pBuffer);

puts(pBuffer);


free(pBuffer);

pBuffer = NULL;

return 0;

}




결과 : 




#c언어, #c언어입문, #프로그램입문, #memmove_s

c언어, c언어입문, 프로그램입문 ,memmove_s

'Programing - C > C Basic grammar ' 카테고리의 다른 글

097 포인터 개념  (0) 2017.08.04
096 memset  (0) 2017.08.04
094 memcmp 두메모리 비교  (0) 2017.07.28
093 memcpy_s 메모리 복사  (0) 2017.07.28
092 realloc 메모리 재할당  (0) 2017.07.28
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

개념 :


strcmp 와 같이 비교를 합니다 대상이 메모리 데이터 자체냐 아니면 문자열이냐의 차이점을 두고있습니다. 사실 둘의 차이는 가독성에 문제이지 전혀 


다른기능을 하는 것이 없이 동일합니다.




소스코드 : main.c

#include <stdio.h>

#include <string.h>

#include <malloc.h>


int main(void)

{

char *pString = "Hello JunmoZzi";

char *pAdd = " ^^a ha ha ha!";


char *pBuffer = NULL;

int nSize1 = strlen(pString) + 1;

int nSize2 = strlen(pAdd) + 1;

pBuffer = calloc(nSize1 + 1, sizeof(char));


if (pBuffer == NULL)

{

puts("memory 할당 실패");

}

else

{

puts("memory 할당 성공");

printf("메모리 주소 : %d\n", pBuffer);

//strcpy_s(pBuffer, nSize1, pString);

memcpy_s(pBuffer, nSize1, pString, nSize1);

}


puts("Run memcmp : pBuffer, pStirng");

if (memcmp(pBuffer, pString, nSize1) == 0)

{

puts("동일한 메모리");//동일한 데이터

}

else

{

puts("동일하지 않는 메모리");

}


puts(pBuffer);

puts("메모리 재 할당");


realloc(pBuffer, nSize1 + nSize2);


pBuffer[nSize1 - 1] = ' ';// 문자열의 끝 \0을 공백으로 변경


 //strcat_s(pBuffer, nSize1+nSize2, pAdd);

memcpy_s(pBuffer + nSize1, nSize2, pAdd, nSize2);

printf("메모리 주소 : %d\n", pBuffer);

puts(pBuffer);


free(pBuffer);

pBuffer = NULL;

return 0;

}




결과


 #c언어, #c언어입문, #프로그램입문, #memcmp, #메모리검사, #메모리비교함수


'Programing - C > C Basic grammar ' 카테고리의 다른 글

096 memset  (0) 2017.08.04
095 memmove_s  (0) 2017.07.28
093 memcpy_s 메모리 복사  (0) 2017.07.28
092 realloc 메모리 재할당  (0) 2017.07.28
091 calloc  (0) 2017.07.28
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

개념  : 


메모리 공간원 원하는 만큼 어떤 자료형이든 복사할수 있다.



목표 :


strcpy_s 와 strcat_s를 쓰지않고 memcpy_s로 대체하기



소스코드 : main.c

#include <stdio.h>

#include <string.h>

#include <malloc.h>


int main(void)

{

char *pString = "Hello JunmoZzi";

char *pAdd = " ^^a ha ha ha!";


char *pBuffer = NULL;

int nSize1 = strlen(pString) + 1;

int nSize2 = strlen(pAdd) + 1;

pBuffer = calloc(nSize1 + 1, sizeof(char));


if (pBuffer == NULL)

{

puts("memory 할당 실패");

}

else

{

puts("memory 할당 성공");

printf("메모리 주소 : %d\n", pBuffer);

//strcpy_s(pBuffer, nSize1, pString);

memcpy_s(pBuffer, nSize1, pString, nSize1);

}


puts(pBuffer);

puts("메모리 재 할당");


realloc(pBuffer, nSize1 + nSize2);


pBuffer[nSize1 - 1] = ' ';// 문자열의 끝 \0을 공백으로 변경


 //strcat_s(pBuffer, nSize1+nSize2, pAdd);

memcpy_s(pBuffer + nSize1, nSize2, pAdd, nSize2);

printf("메모리 주소 : %d\n", pBuffer);

puts(pBuffer);


free(pBuffer);

pBuffer = NULL;

return 0;

}




결과




#memcpy_s, #c언어, #c언어입문, #프로그램입문



'Programing - C > C Basic grammar ' 카테고리의 다른 글

095 memmove_s  (0) 2017.07.28
094 memcmp 두메모리 비교  (0) 2017.07.28
092 realloc 메모리 재할당  (0) 2017.07.28
091 calloc  (0) 2017.07.28
take rest 03 == 비교 연산자를 쓰지 않는 함수를 만들어보기  (0) 2017.07.28
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

개념 : 


malloc 이나 calloc 된 공간을 재 할당  할때 사용합니다.




소스코드 : main.c

#include <stdio.h>

#include <string.h>

#include <malloc.h>


int main(void)

{

char *pString = "Hello JunmoZzi";

char *pAdd = " ^^a ha ha ha!";


char *pBuffer = NULL;

int nSize1 = strlen(pString) + 1;

int nSize2 = strlen(pAdd) + 1;

pBuffer = calloc(nSize1 + 1, sizeof(char));


if (pBuffer == NULL)

{

puts("memory 할당 실패");

}

else

{

puts("memory 할당 성공");

printf("메모리 주소 : %d\n", pBuffer);

strcpy_s(pBuffer, nSize1, pString);

}


puts(pBuffer);

puts("메모리 재 할당");


realloc(pBuffer, nSize1 + nSize2);


strcat_s(pBuffer, nSize1 + nSize2, pAdd);

printf("메모리 주소 : %d\n", pBuffer);

puts(pBuffer);


free(pBuffer);

pBuffer = NULL;

return 0;

}



결과



#realloc,#c언어, #c언어입문, #프로그램입문, #realloc, #메모리재할당


336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
개념 : 

malloc 과 같은 메모리를 할당하는 함수이지만 할당한 공간을 초기화 해준다.



소스코드 : main.c

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

int main(void)
{
char *pString = "Hello JunmoZzi";
char *pBuffer = NULL;
pBuffer = calloc(strlen(pString) + 1, sizeof(char));

if (pBuffer == NULL)
{
puts("memory 할당 실패");
}
else
{
puts("memory 할당 성공");
strcpy_s(pBuffer, strlen(pString) + 1, pString);
}

puts(pBuffer);

free(pBuffer);
pBuffer = NULL;
return 0;
}


결과


#c언어, #c언어입문, #프로그램입문, #calloc


336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
목표 )

비교 연산자를 쓰지 않고 두정수의 같은지 여부를 판별하는 함수를 만들어 본다.


소스 코드 : main.c

#include <stdio.h>


int compare(int source, int dest);


int main(void)

{

int value1 = 1;

int value2 = 2;

int value3 = 1;


int result1 = compare(value1, value2);

int result2 = compare(value1, value3);;


if (result1)

{

printf("value1 과 value2 값은 같습니다. %d \n", result1);

}

else

{

printf("value1 과 value2 값은 같지 않습니다. %d \n", result1);

}



if (result2)

{

printf("value1 과 value3 값은 같습니다. %d \n", result2);

}

else

{

printf("value1 과 value3 값은 같지 않습니다. %d \n", result2);

}


return 0;

}


int compare(int source, int dest)

{

return !(source - dest);// !(source ^ dest) xor 두비트가 같을때만 0을 리턴

}


결과1



이 코드는 비교연산을 사용하지 않습니다.


산술연산자와 비트 연산자 그리고 논리연산자 조합으로 만들어 젔습니다.

효율성윽 그닥 좋지 않습니다.

그래도 만들었으니 설명을 해보면 정수는 간단하게 자기 자신을 빼주면 0이 됩니다.

여기에 논리 연산자를 적용해서 0이면 1로 바꿔줍니다.

그리고 어떤한 값이 들어가게 되면 논리 연산자 NOT은 0으로 바꿔버리는 연산법칙이 있는 점을 이용하여

만들었습니다 . 조금더 발전 시키면!! !(source ^ dest을 사용하셔도 똑같은결과를 얻습니다!!

시스템 적으로 어떻게 좋을가요!!?! 당연 !(source ^ dest효율적인 연산 속도를 얻을 수있어요 

소스코드를 조금 수정하여



소스 코드 : main2.c

#include <stdio.h>

#include <windows.h>


#define MAX 100000000


int compare1(int source, int dest);

int compare2(int source, int dest);


int main(void)

{

int result1 = 0;


int value1 = 0;

int value2 = 0;


unsigned int time1 = 0;

unsigned int time2 = 0;

unsigned int time3 = 0;


int result2 = 0;


int count1 = 0;


time1 = GetTickCount();

while (count1 < MAX)

{

result1 = compare1(value1, value2);

count1++;

}


time1 = GetTickCount() - time1;


count1 = 0;


time2 = GetTickCount();


while (count1 < MAX)

{

result1 = compare2(value1, value2);

count1++;

}


time2 = GetTickCount() - time2;


count1 = 0;


time3 = GetTickCount();


while (count1 < MAX)

{

result2 = (value1 == value2);

count1++;

}


time3 = GetTickCount() - time3;


printf("compare1 : %d \n", time1);

printf("compare2 : %d \n", time2);

printf(" ==  : %d \n", time3);



return 0;

}


int compare1(int source, int dest)

{

return !(source ^ dest);

}


int compare2(int source, int dest)

{

return !(source - dest);

}



결과2



퍼포먼스차이가 분명있습니다.


그냥 비교연산자 쓰는것이 빠릅니다.


또다른 실험으로 ^ 만 사용하면  == 보다는 빠릅니다.

하지만 !을 붙이면 퍼포먼스가 같게 나옵니다.

대입 연산자를 못쓰는 상황에서

두수를 비교할때 가장 근접한 퍼포먼스를 보이는 방법은

!(value1 ^ value2) 을 해주면 된다로 결론이 나옵니다.

즉 (value1 == value2)와 거의 같은 수준의 퍼포먼스를 보입니다.

자세한 내막은 컴파일러만이 아는걸로 ~


#c언어, #c언어입문, #프로그램입문, #비교연산자안쓰고비교하기


336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

개념 : 


1. malloc.h 에 포함되어 있습니다.


2. memory allocation 의 약자 입니다.


3. 힙 영역에 메모리를 할당하는 함수 입니다.


4. 리턴된 값은 void 포인터이고 파라메터값은 정수 형태의 할당할 크기 입니다.

(나중에 void 포인터에 대해서 이야기 할 것 이지만 지금은 그냥 사용을 위해서는 반드시 캐스팅을 해야 한다로만 정의하고 넘어가도록 하겠습니다.)



목표:

문자열의 크기 만큼을 할당하고 문자열을 카피 한다.




소스코드 : main.c

#include <stdio.h>

#include <string.h>

#include <malloc.h>

int main(void)

{

unsigned char* pString = "Hello JunmoZzi";

unsigned char* pBuffer = NULL;

int nLength = strlen((const char*)pString) + 1;// "\0"문자 널까지 포함해서 1 입니다.

pBuffer = (unsigned char*)malloc(nLength);


if (pBuffer == NULL)

{

puts("Failed Memory Allocation!");

return 0;

}


memcpy_s(pBuffer, nLength, pString, nLength);


puts(pString);

puts(pBuffer);


if (pBuffer)

{

free(pBuffer);//메모리 할당했으면 반드시 해제 해준다.

}

return 0;

}



결과



#c언어, #c언어입문, #프로그램입문, #malloc, #메모리동적할당


336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

메모리 영역에 대한 이해가 필요한 이유 


예전 하드웨어에는 턱없이 적은양의 메모리로 구동되었습니다.


그러기 때문에 메모리를 효율적으로 관리 하기 위해서는 영역을 나눠서 관리 할 필요가 있었고,


현재는 메모리 자체가 기가 단위로 되어서 메모리 관리 안해도 되지 않겠냐는 생각도 할 수 있겠지만


그래도 메모리는 무한한 영역이 아니라는 관점에서 관리의 대상이 되는 것은 변함 없습니다.






코드 영역:


사용자에 의해서 작성된 코드가 저장되는 영역입니다.



데이터 영역 :


전역변수와 상수 값이 저장되는 영역입니다.



힙 영역 :


사용자에 의해서 동적으로 할당된 영역입니다.



스택 영역 :


지역변수등 나머지 영역이 할당되는 영역입니다.




힙 영역을 제외하곤 나머지는 컴파일러가 알아서 관리 합니다.

 



#메모리영역,  #c언어입문, #c언어, #프로그램입문



336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

문제 : 


중복 되지 않는 첫번째 문자 값을 찾아 리턴한다.



풀이 : main.c

#include<stdio.h>

unsigned char CheckNonDuplicateCharacters(unsigned char*pString, int nStringSize);


int main(void)

{

unsigned char szString[] = "erreat";


printf("%c", CheckNonDuplicateCharacters(szString, sizeof(szString)));


return 0;

}


unsigned char CheckNonDuplicateCharacters(unsigned char*pString, int nStringSize)

{

unsigned char result = 0;


int nCount = 0;

int nFind = 0;

int nCh = 0;


for (nCount = 0; nCount < nStringSize; nCount++)

{

for (nFind = 0; nFind < nStringSize; nFind++)

{

if (nCount == nFind)

{

continue;

}

else

{

if (*(pString + nCount) & *(pString + nFind))

{

break;

}

}

}


if (nFind == nStringSize)

{

result = pString[nCount];

break;

}

}



return result;

}



결과:





#c언어, #c언어입문, #프로그램입문, #알고리즘, #중복되지않는첫번째문자찾기


'Programing - C > C Basic grammar ' 카테고리의 다른 글

090 malloc 메모리 동적 할당  (0) 2017.07.28
메모리 영역에 대한 이해  (0) 2017.07.28
089 _swab  (0) 2017.07.28
088 is 함수 정리  (0) 2017.07.28
087 isspace 공백과 개행  (0) 2017.07.28
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

개념 


1. stdlib.h 에 포함


2. 문자열에서 2바이트씩 뒤집는다. 



소스코드 : 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>


int main(void)

{

char szBuffer1[256] = "eHll oJ nuoMzz i! ";//{ 'H','e','l','l','o', 0, }; //hello

  // eHll oJ nuoMzz i! "

char szBuffer2[256] = { 0, };

int strlength = 0;

puts(szBuffer1);


puts("---swab---");

strlength = strlen(szBuffer1);

_swab(szBuffer1, szBuffer2, strlength);

puts(szBuffer2);


return 0;

}



결과




 #c언어, #c언어입문, #프로그램입문, #2바이트교환, #swab




+ Recent posts