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. 흔한 53억짜리 보안 컨설팅 (특징 비싸고 실전임)

            미국의 여행사 CWT가 랜섬웨어에 걸려서 약 53억원을 지불한 대화내역이 공개되었습니다.   - Ragnar Locker 랜섬웨어에 걸려서 비트코인으로 $4.5M을 주고 해결 - 해커랑 마치 비즈니스 관계의 대화 처럼 협상이 진행되는게 눈...
    Date2020.08.04 소식 Bytitle: 부장님호무라 Reply21 Views4343 file
    Read More
  2. No Image

    넷기어, 45개의 구형 라우터에서 보안 취약점 제공 안함

    지난 6월, 80여개의 넷기어 공유기/라우터에 심각한 취약점이 있다는 소식이 발표됐습니다. https://www.zerodayinitiative.com/advisories/ZDI-20-712/ 그러나 이 취약점이 존재하는 제품 중 45개는 보안 패치가 제공되지 않습니다. 출시...
    Date2020.08.04 소식 By낄낄 Reply4 Views739
    Read More
  3. No Image

    컴퓨터 인터넷이 갑자기 튀기 시작했습니다.

    안녕하세요. 갑자기 인터넷 핑이 튀기 시작했는데 무엇이 문제인지 알수가 없어 글을 올립니다. 일요일부터 알수없는 문제로 인해 게임이 계속 튑니다. 튀는 게임들은 지금까지 해본건 히오스랑 메이플인데 둘다 튀는데 이상하게 동생이 ...
    Date2020.08.04 질문 Bytitle: AMD파란진주 Reply13 Views708
    Read More
  4. 리눅스 5.8버전 출시

    Qualcomm Adreno 405/640/650 GPU 지원, 새로운 Spectre Ghost 보안 패치, exFAT 파일 형식 향상, Radeon 그래픽 드라이버, IBM Power10 프로세서 지원    
    Date2020.08.03 소식 By알라딘램프지니 Reply5 Views1141 file
    Read More
  5. No Image

    같은 브라우저안에서 특정 웹사이트만 사운드 출력이 달라지는 문제

    안녕하세요. 티비를 듀얼 모니터로 사용하는 과정에서 제목과 같은 문제가 발생했는데 해결책을 못 찾아서 질문을 드립니다.   현재 사용 환경은 다음과 같습니다.   TV1. (43인치 UHD), HD -> HDMI / 일반 스피커로 사운드 출력 TV2. (49...
    Date2020.08.03 질문 By물렁살 Reply8 Views718
    Read More
  6. 녹스 실행오류

    녹스실행시 원래 바탕화면이 나와야하는데   흰화면만 계속나오네요..   vt가능하게 바이오스도 변경했는데 어디가 문제인지 아시는분 계실까요?..  
    Date2020.08.03 질문 By아이스초코 Reply1 Views818 file
    Read More
  7. No Image

    마이크로소프트, 틱톡 인수 논의를 계속할 것

    마이크로소프트는 블로그를 통해 미국 내 틱톡 인수를 위한 논의를 계속한다는 입장을 공식적으로 밝혔습니다.   논의는 9월 15일까지 완료될 것이며, 도널드 트럼프 미 대통령의 우려를 중요하게 생각하고 미국에 적절한 경제 이득을 제...
    Date2020.08.03 소식 By이견 Reply0 Views300
    Read More
  8. No Image

    가민, 랜섬웨어 복호화 키로 서비스 복구

    23일 가민의 주요 서비스가 일시적으로 중단되었고 이것이 랜섬웨어의 공격이라는 정보가 있었습니다. 나흘이 지나 서비스 재개가 시작되었으며 복호화 키를 받은 사실이 확인되었습니다.    가민 일부 서비스 중단, 랜섬웨어 공격?(2020....
    Date2020.08.03 소식 By이견 Reply2 Views578
    Read More
  9. 가장 안정적인 Windows 10 버전은

     v1903과 v1909가 많은 사람들이 쓰고있어서 안정적이라는 내용인거 같습니다. (중국어간체 본문내용 中)  시장 조사 기관인 Netmarketshare가 제공 한 데이터에 따르면 Windows 10의 시장 점유율은 여전히 ​​증가하는 반면 해당 Windows ...
    Date2020.08.03 소식 By알라딘램프지니 Reply9 Views2136 file
    Read More
  10. C 포인터 하나만 여쭤볼게요

    1. int a=3; int *pa; *pa=3; 하면 오류나길래 pa에 주소가 일단 지정되어 있지 않아서 오류구나 라고 생각했거든요. 근데 구조체 만들 때 struct Student *s1 = malloc(sizeof(struct Student)); 로 하던데 malloc으로 반환되는건 주소가...
    Date2020.08.02 질문 By주기율표 Reply12 Views695 file
    Read More
  11. No Image

    유튜브 프리미엄 가격 인상예정

    유튜브 뮤직 전면 유로화에 맞춰서  https://gigglehd.com/gg/7889954     9월2일부터 유튜브 프리미엄 신규가입자 한해서 가격이 인상을 하게 됩니다   기존 8690(부가세 포함)원에서 1만450원(부가세 포함) 으로 오르게 됩니다. 기존가...
    Date2020.08.02 소식 Bytitle: 명사수poin_:D Reply5 Views1282
    Read More
  12. No Image

    크롬 모바일 바뀌고 나서 참 불편하군요

    뭐든지 리뉴얼을 하면 좋아하는 사람보다 싫다고 말하는 사람들이 더 많아요. 저도 해보고, 또 겪어봐서 하는 소힙니다. 그런데 이게 정말 불편해서 불만이 나오는 게 아니라 익숙하지 않아서 나오는 불평인 경우도 꽤 많더군요. 그래서 ...
    Date2020.08.02 일반 By낄낄 Reply10 Views781
    Read More
  13. 20H2로 미리 올렸습니다.

      MS에서 2분기 업데이트(H2)는 기능추가 대신 버그수정과 마이너 업데이트만 포함된다고 했었죠.   20H2 RTM이 10942.xxx로 거의 확정되는 분위기라 올려봤습니다.     눈에 띄는 가장 큰 변화는 드디어! 시작메뉴 사각형 색상이 사용자...
    Date2020.08.02 일반 Bytitle: 흑우Moria Reply5 Views895 file
    Read More
  14. No Image

    MS, 틱톡 인수 협상 중단

    마이크로소프트(MS)의 틱톡 인수 협상이 중단됐다고 월스트리트저널이 1일(이하 현지시간) 보도했다. 전날 도널드 트럼프 대통령이 두 회사 합병에 반대한다고 밝힌 때문이라고 이 신문이 전했다. 이런 가운데 로이터통신은 모회사인 바이...
    Date2020.08.02 소식 By이선예 Reply2 Views723
    Read More
  15. No Image

    넷플릭스, 안드로이드에서 재생 속도 설정 가능

    넷플릭스가 안드로이드 앱에 재생 속도 조절 기능을 추가합니다. 05배, 0.75배, 1.25배, 1.5배로 설정 가능합니다. 물론 1배속 재생은 당연하고요. iOS와 웹에서도 이 기능이 구차될 예정이나, TV 앱은 아직 계획이 없습니다.
    Date2020.08.01 소식 By낄낄 Reply2 Views817
    Read More
목록
Board Pagination Prev 1 ... 329 330 331 332 333 334 335 336 337 338 ... 578 Next
/ 578

최근 코멘트 30개
TundraMC
13:05
폴짝쥐
13:05
방황하는물고기
13:05
폴짝쥐
13:04
파란화면
13:04
TundraMC
13:03
Colorful
12:56
milsa
12:55
milsa
12:51
유지니1203
12:49
白夜2ndT
12:46
白夜2ndT
12:41
마카
12:38
꿀먹은물고기
12:37
고자되기
12:36
소주
12:33
白夜2ndT
12:32
린네
12:31
꿀먹은물고기
12:30
빈도
12:27
babozone
12:20
Colorful
12:11
Argenté
12:05
포인트 팡팡!
12:05
neoncat
12:05
빈도
12:05
ExyKnox
12:01
빈도
11:54
도토로이
11:53
타미타키
11:52

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

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


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

sketchbook5, 스케치북5

sketchbook5, 스케치북5

나눔글꼴 설치 안내


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

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

설치 취소