통합검색
· 마을서비스란?  · 포럼마을  · 일반마을  · 테마마을  · 마을랭킹  · 활동왕
· 덱스퍼트란?  · TECBOX   · PRSBOX   · 이용안내  
· DEXT제품군  · 솔루션베이  · S/W & ESD 컴포넌트
· 프로그램베이
· LiveSeminar  · LiveConference
Visual C++ 포럼마을 입니다.
  마을등급 Visual C++   이 마을은 포럼마을 입니다이 마을은 자유가입제 마을 입니다 마을소개 페이지로 이동 전입신청
마을촌장촌장 나성훈 주민 34036 since 2006-12-29
우리마을 공지사항
질문&답변
강좌&팁
자유게시판
자료실
앨범
개인게시판
마을 게시판
등록된 마을 게시판이
없습니다.
랑데브 게시판
칼럼 게시판
개발자 고충상담
Dev Talk
자유토론방
벼룩시장
재나미 우스개
구인/프로젝트 정보
사람인 채용 게시판
  고객지원 게시판
마이 데브피아
 나의 e-Money 내역
 활동왕 My Page
 스크랩한 게시글보기
 쪽지관리
 주소록관리

 강좌&팁
 char형 포인터는 1단위 ★ short형 포인터는 2단위 ★ int형 포인터는 4단위로 주소 이동  | VC++ 일반 2019-09-21 오전 9:01:03
 shintx  shintx님께 메시지 보내기shintx님을 내 주소록에 추가합니다.shintx님의 개인게시판 가기 번호: 8889 추천:0  / 읽음:984

 

포인터 주소는 1비트 단위'를 사용.

 

 

char형 포인터는 1단위

short형 포인터는 2단위

int형 포인터는 4단위로 주소 위치 이동 갯수    -   주소는 비트 단위이고. 데이터는 바이트 단위 인거 같습니다. ㅇ_ㅇ;;

그렇지만. int* p = 2*3*sizeof(int) 로 메모리를 생성하여도. 주소가 HEX 16단위로 증가한다. ㅇ_ㅇ;; memcpy() 사용은 어렵다.


각 포인터 형에 크기는

32비트 - 4바이트

64비트 - 8바이트

 

몰랐지롱 ㅇ_ㅇ ??

 

 

추가. 다음블로그 이모티콘이 데브피아 게시판에 입력 안됨

 

 

 

 

 

// char 형 포인터. - 1단위로 주소 이동한다.

http://codepad.org/MKioBYyJ

 

 

#include <stdio.h>

 

#define MAX 10

 

int main()

{

    int size = sizeof(char);

    char * pos = (char *) malloc (MAX*size);

    int i;

    for(i=0; i<MAX; i++)

    {

        printf("%d\n", pos+i);

    }

    free(pos);

    return 0;

}


Output:

 

138604664

138604665

138604666

138604667

138604668

138604669

138604670

138604671

138604672

138604673

 

 

 

 

// short 형 포인터. - 2단위로 주소 이동한다.

http://codepad.org/Kln64lbS

 

 

#include <stdio.h>

 

#define MAX 10

 

int main()

{

    int size = sizeof(short);

    short * pos = (short *) malloc (MAX*size);

    int i;

    for(i=0; i<MAX; i++)

    {

        printf("%d\n", pos+i);

    }

    free(pos);

    return 0;

}


Output:

 

161943672

161943674

161943676

161943678

161943680

161943682

161943684

161943686

161943688

161943690

 

 

 

// int 형 포인터. - 4단위로 주소 이동한다.

http://codepad.org/4qYyWub1

 

 

#include <stdio.h>

 

#define MAX 10

 

int main()

{

    int size = sizeof(int);

    int * pos = (int *) malloc (MAX*size);

    int i;

    for(i=0; i<MAX; i++)

    {

        printf("%d\n", pos+i);

    }

    free(pos);

    return 0;

}


Output:

 

164823160

164823164

164823168

164823172

164823176

164823180

164823184

164823188

164823192

164823196

 


 

 

 

이중 포인터 예제입니다.
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNO=20&no=919791&ref=919791&page=1

 

C로 연결리스트 구현하기 ★ 연결리스트 reference 참조로 구현하기 ★ 이중연결리스트 구현하기

http://kldp.org/node/153885

http://kldp.org/node/154578

https://kldp.org/node/155176

 

 

// 윈도우 메모리 구조

https://www.slideshare.net/the1900/2014-43537487

 

// 3장. 64비트 기반 프로그래밍

https://wjdgh283.tistory.com/entry/3장-64비트-기반-프로그래밍

 

// Lecture #3 인텔 프로세서의 내부구조 및 동작 방식 시스템프로그래밍.

https://slidesplayer.org/slide/14697721/

 

// 32bit 자료형 / 64bit 자료형의 크기 정리

https://foxlime.tistory.com/115

 

 

 

// 메모리 할당 함수가 다양합니다. ㅇ_ㅇ;; 각 함수마다 특성을 이해하고 사용해야 할겁니다...

 

malloc - MSDN 설명

https://docs.microsoft.com/ko-kr/cpp/c-runtime-library/reference/malloc?view=vs-2019

 

반환 값

malloc 은 할당 된 공간에 대 한 void 포인터를 반환 하거나 사용 가능한 메모리가 부족 한 경우 NULL 을 반환 합니다. Void이외의 형식에 대 한 포인터를 반환 하려면 반환 값에 형식 캐스팅을 사용 합니다. 반환 값이 가리키는 스토리지 공간은 맞춤 요구 사항이 기본 맞춤보다 작거나 같은 모든 형식의 개체 스토리지에 적절하게 맞춰지도록 보장됩니다. 시각적 개체 C++의 기본 맞춤은 double또는 8 바이트에 필요한 맞춤입니다. 64비트 플랫폼을 대상으로 하는 코드에서는 16바이트입니다. _Aligned_malloc 를 사용 하 여 맞춤 요구 사항이 더 큰 개체에 대 한 저장소를 할당 합니다. 예를 들어 SSE 형식 __m128 및 __m256와을 사용 __declspec(align( n )) 하 여 선언 된 형식 (예: n 은 8 보다 큼)이 있습니다. Size 가 0 인 경우 malloc 는 힙에서 길이가 0 인 항목을 할당 하 고 해당 항목에 대 한 유효한 포인터를 반환 합니다. 요청 된 메모리 양이 적은 경우에도 항상 malloc에서 반환을 확인 합니다.

설명

Malloc 함수는 최소 크기 바이트의 메모리 블록을 할당 합니다. 맞춤 및 유지 관리 정보에 필요한 공간 때문에 블록은 크기 바이트 보다 클 수 있습니다.

메모리 할당이 실패 하거나 요청 된 메모리 양이 _HEAP_MAXREQ를 초과 하는 경우 malloc 은 errno 를 enomem 으로 설정 합니다. 이 오류 및 다른 오류 코드에 대한 자세한 내용은 errno, _doserrno, _sys_errlist 및 _sys_nerr를 참조하세요.

시작 코드는 malloc 를 사용 하 여 _environ, envp및 argv 변수에 대 한 저장소를 할당 합니다. 다음 함수와 해당 와이드 문자는 malloc도 호출 합니다.

 

C++ _set_new_mode 함수는 malloc에 대한 새 처리기 모드를 설정합니다. 새 처리기 모드는 실패 시 malloc 가 _set_new_handler에서 설정한 대로 새 처리기 루틴을 호출 하는지 여부를 나타냅니다. 기본적으로 malloc 은 메모리 할당 실패 시 새 처리기 루틴을 호출 하지 않습니다. 이 기본 동작을 재정의 하 여 malloc 에서 메모리 할당에 실패 한 경우 malloc 는 새 연산자가 같은 이유로 실패 했을 때와 동일한 방식으로 새 처리기 루틴을 호출 합니다. 기본값을 재정의 하려면 프로그램에서 _set_new_mode(1) 조기에 호출 하거나 newmode를 사용 하 여 연결 합니다. OBJ ( 링크 옵션참조).

응용 프로그램이 C 런타임 라이브러리의 디버그 버전에 연결 된 경우 malloc 는 _malloc_dbg로 확인 됩니다. 디버깅 프로세스 동안 힙을 관리하는 방법에 대한 자세한 내용은 CRT 디버그 힙 정보를 참조하세요.

malloc 는 및 __declspec(noalias) __declspec(restrict)로 표시 됩니다 .이는 함수가 전역 변수를 수정 하지 않도록 보장 하 고 반환 된 포인터에 별칭이 지정 되지 않음을 의미 합니다. 자세한 내용은 noalias 및 restrict를 참조하세요.

 

 

 

 

 

 

 

//  char 형 포인터에 데이터 입력

http://codepad.org/eplZaEtT

 

#include <stdio.h>

 

int main()

{

    int n = 1000;

    char * p = (char*) n;

    printf("%d \n", p);

 

    char * pp[10];

    int i;

    for(i=0; i<10; i++)

    {

        pp[i] = (char*) n+i;

        printf("%d \n", pp[i]);

    }

    return 0;

}


Output:

1000 

1000 

1001 

1002 

1003 

1004 

1005 

1006 

1007 

1008 

1009 

 

 

 

// int* p = 2*3*sizeof(int) 로 메모리를 생성하여도. 주소가 HEX 16단위로 증가한다. ㅇ_ㅇ;; memcpy() 사용은 어렵다.

http://codepad.org/WkodWcO3

 

#include <stdio.h>

 

int main()

{

    printf("------------------------\n");

    int n = 1000;

    char * p = (char*) &n;

    printf("%x \n", p);

 

    p = (char*) n;

    printf("%d \n", p);

 

    printf("------------------------\n");

    int i;

    int k;

    int pos = 0;

 

    int x;

    int y;

 

    int size = sizeof(int);

    int  * xy = (int *) malloc (2* 3* size);

 

    memset(xy, 0x00, 2*3*size);

 

    for(y=0; y<3; y++)

    {

        for(x=0; x<2; x++)

        {

           *(xy+pos) = pos+1000;

            printf("xy+pos  : %x      pos : %d     *(xy+pos) : %d \t\t", xy+pos, pos, *(xy+pos));

 

            pos = pos + size;

         }

        printf("\n");

    }

 

    printf("------------------------\n");

//안됨.

//  char * z = (char*) malloc (5);

//  z+1 = xy;

 

    printf("------------------------\n");

    int max = pos;

    char* z[5];

 

    for(i=0; i<5; i++)

    {

        z[i] = xy;

        int * p = (int*) z[i];

//        p = (int*) xy;

 

        pos = 0;

        for(y=0; y<3; y++)

        {

            for(x=0; x<2; x++)

            {

                printf("%x : %d \t", p+pos, *(p+pos));

                pos = pos + size;

            }

            printf("\t\t");

        }

        printf("\n");

    }

 

    printf("------------------------\n");

    int a_xy[2][3];

    for(i=0; i<5; i++)

    {

        int * p = (int*) z[i];

 

        pos = 0;

        for(y=0; y<3; y++)

        {

            for(x=0; x<2; x++)

            {

                printf("%x : %d \t", p+pos, *(p+pos));

                pos = pos + size;

            }

            printf("\t\t");

        }

        printf("\n");

    }

 

    printf("------------------------\n");

 

    for(i=0; i<5; i++)

    {

        int * p = (int*) z[i];

 

        pos = 0;

        for(y=0; y<3; y++)

        {

            for(x=0; x<2; x++)

            {

                a_xy[x][y] = *(p+pos);

 

                printf("%d \t", a_xy[x][y]);

                pos = pos + size;

            }

            printf("\t\t");

        }

        printf("\n");

    }

 

    printf("------------------------\n");

    int tpos = 0;

    for(i=0; i<5; i++)

    {

        int * p = (int*) z[i];

        printf("%x \n", z[i]);

 

        memcpy(&a_xy[0][0], p+tpos, 2*3);

//        tpos = tpos + 2*3*size;  안됨.

        tpos = tpos + 2*3;

 

        for(y=0; y<3; y++)

        {

            for(x=0; x<2; x++)

            {

                printf("%d \t", a_xy[x][y]);

            }

        }

        printf("\n");

    }

 

 

    free(xy);

 

    return 0;

}


Output:

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

ff8c6fd4 

1000 

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

xy+pos  : 91f0078      pos : 0     *(xy+pos) : 1000 xy+pos  : 91f0088      pos : 4     *(xy+pos) : 1004 

xy+pos  : 91f0098      pos : 8     *(xy+pos) : 1008 xy+pos  : 91f00a8      pos : 12     *(xy+pos) : 1012 

xy+pos  : 91f00b8      pos : 16     *(xy+pos) : 1016 xy+pos  : 91f00c8      pos : 20     *(xy+pos) : 1020 

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

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

91f0078 : 1000 91f0088 : 1004 91f0098 : 1008 91f00a8 : 1012 91f00b8 : 1016 91f00c8 : 1020 

91f0078 : 1000 91f0088 : 1004 91f0098 : 1008 91f00a8 : 1012 91f00b8 : 1016 91f00c8 : 1020 

91f0078 : 1000 91f0088 : 1004 91f0098 : 1008 91f00a8 : 1012 91f00b8 : 1016 91f00c8 : 1020 

91f0078 : 1000 91f0088 : 1004 91f0098 : 1008 91f00a8 : 1012 91f00b8 : 1016 91f00c8 : 1020 

91f0078 : 1000 91f0088 : 1004 91f0098 : 1008 91f00a8 : 1012 91f00b8 : 1016 91f00c8 : 1020 

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

91f0078 : 1000 91f0088 : 1004 91f0098 : 1008 91f00a8 : 1012 91f00b8 : 1016 91f00c8 : 1020 

91f0078 : 1000 91f0088 : 1004 91f0098 : 1008 91f00a8 : 1012 91f00b8 : 1016 91f00c8 : 1020 

91f0078 : 1000 91f0088 : 1004 91f0098 : 1008 91f00a8 : 1012 91f00b8 : 1016 91f00c8 : 1020 

91f0078 : 1000 91f0088 : 1004 91f0098 : 1008 91f00a8 : 1012 91f00b8 : 1016 91f00c8 : 1020 

91f0078 : 1000 91f0088 : 1004 91f0098 : 1008 91f00a8 : 1012 91f00b8 : 1016 91f00c8 : 1020 

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

1000 1004 1008 1012 1016 1020 

1000 1004 1008 1012 1016 1020 

1000 1004 1008 1012 1016 1020 

1000 1004 1008 1012 1016 1020 

1000 1004 1008 1012 1016 1020 

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

91f0078 

1000 1004 0 1012 1016 1020 

91f0078 

215 1004 3953 1012 1016 1020 

91f0078 

1012 1004 0 1012 1016 1020 

91f0078 

0 1004 0 1012 1016 1020 

91f0078 

0 1004 0 1012 1016 1020 

 


 

 

 

 

[코멘트] 좋음
2019-09-23 19:25
 omlnet  omlnet님께 메시지 보내기omlnet님을 내 주소록에 추가합니다.omlnet님의 개인게시판 가기 
1바이트 아닌 홀수개 바이트로 만든 구조체의 배열은 몇바이트씩 증가 할까요? ( 3바이트 나 5바이트 구조체 경우죠.. )
저장 취소
[코멘트] 좋음
2019-09-23 23:29
 shintx  shintx님께 메시지 보내기shintx님을 내 주소록에 추가합니다.shintx님의 개인게시판 가기 
char 는 1단위로 증가
int 는 4단위로 증가
int char 인 경우는 8단위
char int 인 경우는 8단위로 증가합니다.
char int int 인 경우는 12단위

char int double 인 경우는 16단위
0xxx0000
00000000 ㅇ_ㅇ;; 이럴겁니다. 1 + 빈곳3 + 4 + 8 = 16

구조체 패딩 비트? 와 관계가 있는것 같습니다.
변수 중의. 최대 크기에 맞춰서. 합쳐서 증가'하는것 같습니다.

http://codepad.org/hwelMQ7K


#include < stdio.h >

#define MAX 10

typedef struct DF_
{
char n;
int n2;
} ST;

int main()
{
int size = sizeof(ST);
ST * pos = (ST *) malloc (MAX*size);
int i;
for(i = 0; i < max; i++ )
{
printf("%d\n", pos+i);
}
free(pos);
return 0;
}

137228408
137228416
137228424
137228432
137228440
137228448
137228456
137228464
137228472
137228480
저장 취소
[코멘트] 좋음
2019-09-24 12:27
 bro  bro님께 메시지 보내기bro님을 내 주소록에 추가합니다.bro님의 개인게시판 가기 
omlnet님/ data structure alignment 키워드로 검색해보시면 자세히 아실수 있을겁니다.
https://en.wikipedia.org/wiki/Data_structure_alignment
cpu가 해당 변수를 메모리에서 읽어가려면 word 단위로 읽어가는데, 만일 해당 변수가 word 단위에 걸쳐서 있다면
해당 변수를 두 번 억세스해야 하니까 성능상 좋지 못하겠죠. 그래서 컴파일러는 structure안의 변수들을 되도록
word 단위로 alignment시킨 메모리 레이아웃을 갖도록 structure를 다룹니다. (대신 메모리 사용량은 늘어나지만요)
물론 vc에선 #pragma pack(1)이나 gcc에서 __attribute__((__packed__)) 같은 지정자를 써서 컴파일러로 하여금
해당 structure를 padding하지 말게 할 수 있습니다.
저장 취소
[코멘트] 좋음
2019-12-01 10:19
 shintx  shintx님께 메시지 보내기shintx님을 내 주소록에 추가합니다.shintx님의 개인게시판 가기 
포인터의 크기, 제대로 알자! | 마을 :: 컨텐츠 상세보기 - 하지만. 클래스 포인터의 크기는 다른 경우도 있다..
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNO=20&no=8866&page=1
저장 취소
코멘트쓰기
  좋음   놀람   궁금   화남   슬픔   최고   침묵   시무룩   부끄럼   난감
* 코멘트는 500자 이내(띄어쓰기 포함)로 적어주세요.
목록 보기   지금 보고 계시는 글을 회원님의 my Mblog >> 스크랩에 넣어두고 다음에 바로 보실 수 있습니다.  
회사소개  |   개인정보취급방침  |  제휴문의  |   광고문의  |   E-Mail 무단수집거부  |   고객지원  |   이용안내  |   세금계산서
사업자등록번호 안내: 220-81-90008 / 통신판매업신고번호 제 2017-서울구로-0055호 / 대표: 홍영준, 서민호
08390, 서울시 구로구 디지털로32길 30, 1211호 / TEL. 02_6719_6200 / FAX. 02-6499-1910
Copyright ⓒ (주) 데브피아. All rights reserved.