Skip to content

기글하드웨어기글하드웨어

인터넷 / 소프트웨어 : 윈도우즈, 리눅스, 기타 운영체제, 각종 어플리케이션, 프로그램, 소프트웨어, 인터넷, 인터넷 서비스에 대한 이야기, 소식, 테스트, 정보를 올리는 게시판입니다.

Extra Form

1.

int a=3;

int *pa;

*pa=3;

하면 오류나길래

pa에 주소가 일단 지정되어 있지 않아서 오류구나 라고 생각했거든요.

근데 구조체 만들 때

struct Student *s1 = malloc(sizeof(struct Student));

로 하던데 malloc으로 반환되는건 주소가 아니라 메모리 크기라고 생각했는데

그게 아니라 메모리 크기만큼 OS에서 할당 한 후 그 주소의 제일 앞 부분을 리턴하는건가요?

 

2. 그게 맞다면 위의 pa관련 코드를 pa=&a;로 바꿔서 pa의 실체가 a라는 명칭이 있지만 s1의 실체는 명칭이 없는 건가요?

 

3. 

struct Student *current = s1;
for (;current != NULL;current=current->next)

{
        printf("%.2lf\n", current->grade);
}

Student라는 구조체가 double grade과 Student *next를 가지는데

grade를 순서대로 출력하라고 할 때 이렇게 쓰니까 되더라구요.

*s1, *s2, *s3는 제대로 구현했고 실제로 동작도 잘 합니다.

 

s1이 실제 구조체가 아니라 구조체 포인터니까 직접 next와 grade를 갖는게 아니라

s1은 안가지고 있고 다른 공간에 next와 grade가 있을거고

*current가 갖고있는 값을 s1의 주소인데도 왜 오류가 안날까요?

(current,[s1의주소]) (s1,[실제구조체주소])  ([next=s2주소],[grade=100])

s1->grade = 100인건 이해가 가는데, current->grade가 왜 바로 s1->grade가 되는지 모르겠습니다. ㅠㅠ

current->->grade같은게 될 것 같은데 ...

 

 

1,2번이 맞다고 가정하고 메모리에 들어갈 것들을 표현했는데 이게 맞을까요?

image.png

포인터들에 들어간 값은 주소를 의미합니다.

*s1, *s2들이 갖는 실제 구조체들은 이름이 없습니다. 구조체포인터들은 구조체 주소만을 가집니다.



  • profile
    Koasing      PROBLEM? 2020.08.02 23:24
    1.
    시스템 함수던 어떤 것이던 사용하는데 있어 궁금증이 생긴다면 레퍼런스 문서를 찾아보시는게 좋습니다.
    http://www.cplusplus.com/reference/cstdlib/malloc/ 을 보시면, malloc은 인자로 주어진 크기만큼의 바이트를 메모리에 할당하고, 해당 블록의 시작 주소를 반환합니다.

    2.
    주어진 코드만 보았을 때에는 a와 pa는 아무런 관계가 없습니다.
    게다가 pa는 초기화도 되어 있지 않으므로 메모리 상의 어느 주소를 가르키고 있는지도 모릅니다. 마구잡이로 아무 주소나 역참조 하여 3이라는 값을 저장하려고 하면 segfault 내지는 허용되지 않은 메모리 접근이라고 오류가 발생하겠지요.
    pa = &a; 로 주소를 지정해 줌으로써 a와 pa는 비로소 참조 관계를 갖게 됩니다.

    그리고 변수의 실체... 라고 하면 스택과 힙 같은거로 파고들어가야 해서 머리아파집니다만, 기술하신 내용이 넓은 범위에서 틀리지는 않습니다.

    3.
    s1과 current 모두 Stduent 구조체를 가리키는 포인터입니다. current를 초기화하면서 저장한 값은 s1이라는 변수의 주소인가요? 아니면 s1 변수의 값(=s1이 가리키고 있는 구조체의 주소)인가요? 한 번 생각해 보시면 답이 나올 것입니다.
  • profile
    주기율표 2020.08.02 23:30
    1번은 감사드립니다. 크기반환이 아니라 주소반환이였네요. 레퍼런스를 어디서 찾는지 궁금했는데 C대신 C++에서 알려주네요.
    2번 질문은 pa=&a;로 바꿔야 하는데 깜빡했네요 ㅠ
    3번은 더 생각해봐야겠습니다. s1은 구조체를 가리키는 포인터, current는 s1이라는 구조체 포인터를 가리키는 포인터라서
    이중포인터같은걸 생각했는데 ㅠㅠ 이중포인터에서 값을 나타내고 싶을 때 **로 표현하길래 멤버 연산자인 ->도 두번씩 써야하는게 아닌가 싶은데 어렵네요
  • profile
    title: 야행성프리지아      Facta, Non Verba 2020.08.03 00:08
    2번 질문에 대한 대답은... 명칭은 중요한 게 아닙니다.
    '실체가 있다'고 생각하신 변수는 stack에 존재하는 것이고, '실체가 없다'고 생각하신 건 heap에 존재합니다.
    stack에 잡힌 메모리 영역은, 최소한 C, C++에서는 변수명을 지정하지 않고서는 메모리를 할당할 방법이 없습니다.
    heap에 잡힌 메모리 영역은 malloc (C), new (C++) 등의 명령어로 확보할 수 있으며, 해당 명령어가 반환하는 값은 heap 영역의 메모리 주소입니다.

    3번에서는
    s1은 heap에 확보된 student structure의 주소이며, current가 가진 값은 s1의 주소가 아니라 s1 자체입니다.
    current가 s1의 주소가 되려면 current = &s1 이 되어야죠.
    만일 current = &s1 이라면, 일반적으로는 current->->grade가 아니라 (*current)->grade 식으로 접근합니다.
  • profile
    ForGoTTen      결제중.... 2020.08.03 00:15
    사실...모든 프로그래밍 언어가 그렇지만 특히 내부적으로 C에서는 함수의 이름이나 변수의 이름 자체가 메모리 주소가 됩니다. 우리가 current나 s1 이라고 부르지만 실상은 내부적으로 0x000234니, 0x210466이니 하는 주소로 1:1맵핑되죠. (이는 2번의 답이 될 수도 있습니다. 실체(값)도 있고, 명칭(주소)도 있지만, 단순히 그 주소가 명시적으로 어떤 변수명에 할당되지 않을수도 있습니다. 즉 s1이 가리키는 malloc으로 할당된 주소는 있으나 명시적으로 해당 주소에 맵핑된 이름은 존재하지 않고, 포인터로 한 번 건너서만 접근할 수 있죠. )

    malloc으로 동적할당된 grade가 0x001의 주소로 할당되었다면, for loop의 current=current->next 부분에서 양쪽이 포인터, 포인터 = 포인터 할당 연산이기 때문에, current = 0x001, s1 = 0x001 의 값을 가지게 됩니다. (current -> s1 -> grade(0x001)의 관계가 아닌)

    내부적으로 (메모리 주소 = 값)형식으로 표현하자면, 0x000234(current) = 0x001 , 0x210466(s1) = 0x001로 할당되고, 우리가 s1으로 접근하던, current로 접근하던 -> 연산자로 "변수의 주소값이 아닌 변수가 가리키는 주소값의 값" 인 0x001번지를 참조하기 때문에 같은 값이 나옵니다.
  • profile
    주기율표 2020.08.03 00:25
    답변 모두 감사합니다. 3번은 혹시나해서 찍어보니까 정말로 주소가 동일하게 나오네요... 이중 참조일 줄 알았는데...
    int a=1, *pa=&a; 이고 int arr[1]={0}, *parr = arr; 이길래 무조건 해당변수의 주소가 들어갈 줄 알았는데
    이미 그전이 포인터면 포인터가 가리키는 곳의 주소를 바로 때려 박네요.. 몰랐습니다.
    int *par[1]={3}, *ppar=par; 일때 포인터par이 갖는 값(주소)와 포인터 ppar이 갖는 값(주소)이 같다니 ㅠ
  • ?
    포인트 팡팡! 2020.08.03 00:25
    주기율표님 축하합니다.
    팡팡!에 당첨되어 5포인트를 보너스로 받으셨습니다.
  • profile
    ForGoTTen      결제중.... 2020.08.03 00:38
    포인터 = 포인터의 할당 연산이기 때문에 그렇습니다.

    일반적인 "변수 = 변수" 할당연산에서도 (int a = 3; int b = a;) 의 연산에서 변수 = 변수는, 왼쪽 b의 (Lvalue -주소) 에 오른쪽 a의 ( Rvalue - "값") 이 그대로 복사되어 할당됩니다.

    이는 동일하게 "포인터 = 포인터"의 할당 연산도, int *a = &pa 라면, 실상은 int a = 0x1234 (pa의 주소)와 다를 바 없고, int *b = a 연산은 int b = a = 0x1234로써, 0x1234라는 값이 "복사" 되어서 할당되기에, ' * '나 ' -> ' 같이 그 값이 가리키는 주소의 값 에서 참조해오는 포인터 연산자를 사용하면 같은 주소가 참조되는 것이죠.
  • profile
    레드팍스 2020.08.03 04:54
    struct Student *current = s1;
    는 current 의 포인터 변수의 선언과 초기값 대입을 동시(한줄)에 적은 겁니다.

    struct Student *current; current = s1; 입니다.
    struct Student *current; *current = s1; 가 아닙니다.
  • profile
    이자인 2020.08.03 00:36
    포인터 변수는 주소를 값으로 갖는다.. 라고 생각하시면 편할 것 같습니다
  • ?
    레이지버드      i5-8400 / EVGA Z370 Classified K / G.Skill DDR4 3600MHz CL15 XMP 2020.08.03 08:25
    저는 아래 링크에서 C언어 레퍼런스를 검색합니다. 참고하세요.
    http://manpages.ubuntu.com

    이론상 메모리 주소를 알고 있다면 아래와 같은 식도 가능합니다.
    *(int *)0x1234 = 10;

    변수를 써서 위의 식을 표현하면
    int *pa = 0x1234;
    *pa = 10;
    또는
    int *pa;
    pa = 0x1234;
    *pa = 10;
    와 같습니다. malloc을 사용한다면 0x1234를 malloc으로 대체하시면 됩니다.
  • profile
    rlrbsl 2020.08.03 14:49
    나머지는 어느 정도 답변이 된 거 같으니 사족 하나만 덧붙이자면..
    선언부에서 int *는 int의 주소라는 자료형을 정의하는 것이고
    이후 대입/연산에서 *의 의미는 변수가 가진 주소를 역참조한다(찾아간다(?))는 의미입니다.
    이중참조 선언을 하려면 단어 그대로 (자료형)**로 정의하시면 됩니다.
  • profile
    주기율표 2020.08.03 15:51
    전부 감사드립니다. 오개념을 덕분에 하나 고치고 배워갑니다.

작성된지 4주일이 지난 글에는 새 코멘트를 달 수 없습니다.


  1. No Image

    “국내 넷플릭스 이용자, 인터넷망 업체로부터 연간 5060억원 편익”

    20일 변상규 호서대 교수가 ‘산업경제연구’에 발표한 보고서에 따르면 넷플릭스 구독자들(350명 대상 설문)이 생각하는 망 이용료 대가는 월 평균 3667원이었다. 변 교수는 시장조사업체 ‘모바일 인덱스’가 2022...
    Date2024.04.21 소식 By낄낄 Reply9 Views1024
    Read More
  2. 인터넷에서 진짜 사람의 활동은 극소수

    임페르바의 배드 봇 리포트라는 보고서에 따르면 실제 사람이 인터넷을 쓰는 양은 그리 많지 않으며, 대부분이 봇이라고 합니다. 봇이라고 해도 멀쩡한 봇이 아니라 2/3은 악성 봇입니다. 이런 악성 봇이 없었다면 온라인 활동의 3/4는 사...
    Date2024.04.21 소식 By낄낄 Reply14 Views1470 file
    Read More
  3. No Image

    알리발 'CPU' 대량 압류?…세관, '언더밸류' 혐의 조사

    중국 최대 전자상거래 사이트 알리익스프레스(이하 알리)를 통해 해외직구로 들어온 컴퓨터 중앙처리장치(CPU) 제품들이, '언더밸류'를 이유로 세관에 대거 압류돼 조사받고 있는 것으로 드러났다. 통화 속 세관 관계자는 "판매자...
    Date2024.04.19 소식 By낄낄 Reply17 Views2275
    Read More
  4. No Image

    ‘인터넷 주민번호’ 아이핀도 뚫렸다!

    아이핀을 발급한 운영 업체에서 인증 절차에 문제가 있었던 것으로 KBS 취재 결과 확인됐습니다. 1단계와 2단계에서 확인됐던 개인 정보가 각각 다른 사람의 것인데도, 아이핀이 발급되는 허점이 있었습니다. 1, 2단계 정보가 일치하는지...
    Date2024.04.19 소식 By낄낄 Reply7 Views995
    Read More
  5. 페이스북(메타), '생성-AI(인공지능)' 기반 오픈 소스 언어 모델의 신규 버전 발표(LlaMA-3)

    ▶ 페이스북(메타), '생성-AI(인공지능)'의 오픈 소스 언어 모델 신규 버전 발표 - 차세대 '오픈 소스 언어 모델'의 신규 버전(LlaMA) : LlaMa-3 - 신규 버전의 추가 포함 기능(LlaMA-3) : LlaMa-Guard II, 코드 쉴드, CyberSec-Eval II(...
    Date2024.04.19 소식 By블레이더영혼 Reply1 Views514 file
    Read More
  6. No Image

    챗GPT가 최신 취약점을 활용해 공격할 수 있음

    챗GPT 같은 LLM이 1일 취약점(발표 다음날 바로 패치가 필요할 정도로 위험한 취약점)을 활용해서 공격할 수 있다고 합니다. 15개의 1일 취약점 데이터 세트를 구해서 시켜 봤더니 GPT-4는 취약점의 87%를 써먹었다고 하네요. 설명이 없었...
    Date2024.04.19 소식 By낄낄 Reply5 Views805
    Read More
  7. No Image

    리눅스 Nouveau 드라이버 관리자가 NVIDIA에 합류

    10년이 넘도록 리눅스 커널용 오픈소스 NVIDIA GPU 드라이버인 Nouveau의 수석 관리자로 일했던 Ben Skeggs가 NVIDIA에 입사했습니다. 이 사람은 2013년 9월 18일에 원래 직장이던 레드햇에서 퇴사하면서 오픈소스 드라이버 개발에서도 손...
    Date2024.04.19 소식 By낄낄 Reply1 Views626
    Read More
  8. No Image

    유튜브, 광고 차단 앱 사용시 불이익

    유튜브는 광고 차단 앱을 비롯해 서비스 약관을 위반하는 써드파티 앱을 사용하는 시청자는 동영상을 재생할 때 버퍼링이 발생하거나 영상 표시가 안 될 수 있다고 공지했습니다. 유튜브가 광고 차단을 차단하는 건 이해가 되지만 그 전에...
    Date2024.04.17 소식 By낄낄 Reply12 Views1476
    Read More
  9. No Image

    리누스 토발즈, 탭 vs 스페이스에서 뭘 쓰든간에 파싱은 되어야 되잖아!

    리누스 토르발즈의 모든 행동은 아시다시피 뉴스거리가 됩니다.   지난주 커밋에서는 탭 문자를 공백으로 대체하여 한 줄에서 정확히 한 가지만 변경했습니다. "Kconfig 파서가 오류 없이 파일을 읽는 데 도움이 됩니다." Torvalds는 The ...
    Date2024.04.17 소식 Bytitle: 폭8책읽는달팽 Reply10 Views1241
    Read More
  10. 하아 유튜브.. 또 무슨 삽질이니..

      또디자인 바꾼다고 저러는건지 정신놓고 있는것 같습니다. 전체화면이나 영화관모드 등의 버튼이 UI 가 씹혀서 안보여요;     그리고 얼마전부터 플레이어 비율이 영상 비율대로 안가는 바람에,   가끔 이런식으로 자막이 깔리는 부분...
    Date2024.04.16 일반 Bytitle: 가난한AKG-3 Reply5 Views2185 file
    Read More
  11. No Image

    엑셀시트 비밀번호 얼마나 강력한가요

    자작한 스프레드시트 하나를 열기 보호하고 싶은데요 예전 엑셀은 zip파일로 압축해서 메모장 열고 sheet protection 부분만 지우면 보호가 멀끔히 사라져 있으나 마나했는데요 요즘 엑셀 버전은 꽤나 강력한지 못 푸는거 같은데 이것도 ...
    Date2024.04.16 질문 By왓땃따뚜겐 Reply3 Views1256
    Read More
  12. No Image

    광섬유로 301Tb/s 전송에 성공

    Aston 대학 연구팀이 영국 가정의 평균 광대역 속도인 69.4Mb/s보다 450만배 빠른 301Tb/s로 데이터 전송에 성공했습니다. 광섬유에서 사용하지 않던 새로운 파장 대역을 활용해서 전송했기에, 기존 광섬유 네트워크를 활용할 수 있다는 ...
    Date2024.04.16 소식 By낄낄 Reply3 Views1112
    Read More
  13. No Image

    '카카오-라인' 통합 브랜드로 亞 1위 블록체인 도전장

    카카오와 라인(네이버 계열사)에서 출발한 두 블록체인 프로젝트 '클레이튼'과 '핀시아'가 하나로 통합된 브랜드로 아시아 시장 선점에 나선다. 13일 블록체인 업계에 따르면 클레이튼·핀시아 재단은 오는 30일 ...
    Date2024.04.16 소식 By낄낄 Reply2 Views785
    Read More
  14. No Image

    일론 머스크, X의 신규 가입자 대상으로 유료화?

    일론 머스크는 X(트위터)의 신규 가입자가 글을 쓸 때 약간의 돈을 내도록 하는 것이 봇을 막는 유일한 방법이라고 말했습니다. 지금 AI나 봇은 캡차를 쉽게 뚫을 수 있다는 말도 덧붙였습니다.
    Date2024.04.16 소식 By낄낄 Reply4 Views613
    Read More
  15. No Image

    로켓레이크에서 윈도우 11 업데이트 에러가 해결됨

    11세대 코어 프로세서, 로켓레이크에서 윈도우 11의 업데이트 실행을 방해하는 버그가 마침내 해결됐습니다. 로켓레이크의 인텔 스마트 사운드 테크놀러지 드라이버가 윈도우 11에서 블루스크린 충돌을 일으켰던 것이 그 이유입니다. 문제...
    Date2024.04.16 소식 By낄낄 Reply3 Views739
    Read More
목록
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 579 Next
/ 579

최근 코멘트 30개
wwsun98
18:27
TundraMC
18:20
쿠클라델
18:20
CKyuJay
18:20
툴라
18:19
애플마티니
18:18
kerberos
18:15
AKG-3
18:11
야생감귤
18:09
에드화이트
18:08
강제
18:00
강제
18:00
Argenté
17:59
냥뇽녕냥
17:57
까르르
17:48
까르르
17:43
책읽는달팽
17:43
툴라
17:33
PAIMON
17:30
유입입니다
17:29
Argenté
17:29
M16
17:24
Iwish
17:21
애플마티니
17:14
TundraMC
17:13
바람돌이
16:53
벨드록
16:49
PLAYER001
16:48
아이들링
16:47
린네
16:43

MSI 코리아
AMD
더함
한미마이크로닉스

공지사항        사이트 약관        개인정보취급방침       신고와 건의


기글하드웨어는 2006년 6월 28일에 개설된 컴퓨터, 하드웨어, 모바일, 스마트폰, 게임, 소프트웨어, 디지털 카메라 관련 뉴스와 정보, 사용기를 공유하는 커뮤니티 사이트입니다.
개인 정보 보호, 개인 및 단체의 권리 침해, 사이트 운영, 관리, 제휴와 광고 관련 문의는 이메일로 보내주세요. 관리자 이메일

sketchbook5, 스케치북5

sketchbook5, 스케치북5

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소