c언어 포인터 메모리사이즈에 대한 질문드립니다

lsc1117의 이미지

아주 초보적인 질문입니다

int *ptr

int형 포인터 변수를 선언하였습니다. sizeof 해보면 4바이트인 것을 알 수 있습니다

ptr = (int *)malloc(sizeof(int));

ptr 포인터변수에 4바이트 만큼의 공간을 할당하였습니다.

============ 그런데 여기서 질문입니다 ===========
제가 이해하기로는 위 작업을로 ptr에 할당된 메모리는 주소공간 4byte + malloc으로 한 데이터공간 4byte 합이 8byte라 생각하였습니다.
제가 생각한 것이 틀린건지
ptr[1] = 3;
ptr[2] = 4;
이런것들이 모두 segmentation fault 없이 잘 동작하던데 그럼 제가 생각한 8byte의 메모리할당이 아닌것인데...

이건 뭐 int ptr[9999999999]와 같은건데...

위에 제가 생각한 것중 어느부분이 틀린것인가요??

clapmin의 이미지

아마도 C에서는 선언한 배열의 크기보다 큰 영역에 접근할때 오류가 안나고 침범하는 걸로 알고 있어요.
얼마전에도 제가 배열 a[20] b[20]을 선언하고 b[]에서 20이 넘는 위치를 참조해서 데이터를 입력시켰는데 a배열로 데이터가 저장되는데 오류는 뜨지 않더라구요 ㅎㅎ
여기서 a[]로 넘어간거는 우연이겠지만 말이죠 ㅎ

lsc1117의 이미지

관련해서 좀더 검색해보니 혹시 페이징이 관련이 있을수 있다 생각하였습니다
MMU에서 페이지폴트를 처리한다는데 좀더 구글링 해봐아ㅏ 겠습니다 ㅎㅎ
감사합니다

twinwings의 이미지

https://kldp.org/node/153150

예전에 답변 달아놓은게 있네요.

PS. 찾아보니 MMU 관련해서 잘못 글을 달았네요. 해당부분 지웁니다.

gosuchoi의 이미지

제 짧은 소견을 말하겠습니다. 안 맞는 부분은 고수들의 정정 부탁드립니다.
지금 할당하신 메모리는 8bytes, 4bytes는 스택에 4 bytes는 힙에 할당이 될겁니다. 힙에 4bytes를 malloc으로 할당해도 실제로는 조금 더 잡힙니다. 예를 들면 할당된 주소 어드레스 이전 4bytes에 전체 할당된 길이가 저장되어서, 나중에 free할때 정확하게 할당된 바이트만큼 해제합니다.
지금 말씀하신 segmentation fault는 엑세스가 금지된 지역에 엑세스 할때 발생합니다. 예를 들어서 지금 프로그램에서 ptr를 null로 세팅하고, [0], [1] , [2]로 인덱싱하면 아마 segmentation fault가 뜰겁니다. ptr[1], ptr[2]에 값을 할당해도 엑세스가 가능한 지역이면 그냥 에러없이 진행이 됩니다. 이게 가장 디버깅이 힘든 에러입니다. 왜냐하면 이때, 그다음 메모리 영역을 할당받은 프로그렘에서 에러가 생깁니다. 왜냐하면 그 프로그램의 의사와 상관없이 값이 바뀌니까요. 물론 어떨때는 에러가 안생기도 하겠지만, 대개는 생깁니다. 그럼 나타나는 현상은 프로그램의 이곳 저곳에서 문제가 생깁니다. 원인은 하나인데, 나타나는 에로 결과는 여러군데 흩어져 있으므로, 디버깅할려면 골치를 썩힙니다. 프로그램이 좀 크면, 전체 프로그램을 뒤져봐야 합니다. 요즘은 valgrind라던가 메모리에 월을 세워서 할당된 영역을 넘어서 엑세스하는 것을 디버깅하는 툴로 하면 간단할수도 있지만, 테스트는 좋지만, 실전에서는 절대, 절대로 해서는 안됩니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.