포인터와 배열의 차이??

harisoo의 이미지

#include
#include

int main(void)
{
char src[] = "1234$5678#";
char *ptr;

for ( ptr = strtok(src,"$#"); ptr != NULL ; ptr = strtok(NULL,"$#") )
{
printf("%s\n",ptr);
}

return 1;
}

이렇게 코드를 작성하고 컴파일하면 잘댑니다...

그런데 문제는
char src[] = "1234$5678#"; ==> char *src = "1234$5678#";

이렇게 바꿔서 컴파일하고난뒤 실행하면 세그먼트폴트가 나옵니다.
이상해서 -g옵션을 줘서 gdb로 한스텝씩 실행햇습니다.
에러없이 종료되네요 ㅠㅠ

대체 이유가 뭔가요??

Anonymous~의 이미지

char src[] = "1234$5678#"; // (1)
char *src = "1234$5678#"; //(2)

위 두 코드의 차이는, (1)은 src가 배열이라서 배열 안의 내용을 고칠 수 있는 데 비해서, (2)는 문자열 상수를 가리키는 포인터라서 src가 가리키는 메모리 공간을 수정할 수 없다는 점입니다.

strtok는 매개변수로 넘겨받은 메모리 공간에 쓰기를 시도하므로, (2)와 같이 프로그램을 작성했다면 당연히 정의되지 않은 동작을 일으키게 되는 것입니다.

포인터와 배열의 차이, 그리고 strtok 함수에 대해서 정확히 알고 있다면 이해하실 수 있는 문제입니다.

harisoo의 이미지

왜 gdb로 한스텝씩 할때는 에러가 생기지 않는걸까요?

Anonymous~의 이미지

> 왜 gdb로 한스텝씩 할때는 에러가 생기지 않는걸까요?

원인이 무엇인지는 설명하기 쉽지만, 그 결과가 왜 그런지는 복잡한 문제라서 쉽게 답해드리기 어렵습니다. CPU, 운영체제, 컴파일러, gdb 등등 각각의 특성에 따라 어디로 튈지 모르는 문제이기 때문입니다.

하여간에 말씀 드릴 수 있는 것은, 운영체제건 gdb건 누가 되었던간에, 접근할 수 없는 메모리 공간에 접근하려는 시도를 적절하게 차단하려 할 것이고 그것이 프로그램을 비정상적으로 종료하게 할 것이라는 점입니다. 하지만 그것이 어떤 방식으로 언제 이루어질 것인가에 대해서는 말씀드릴 수 없습니다.

죠커의 이미지

Quote:
char src[] = "1234$5678#"; // (1)
char *src = "1234$5678#"; //(2)

위 두 코드의 차이는, (1)은 src가 배열이라서 배열 안의 내용을 고칠 수 있는 데 비해서, (2)는 문자열 상수를 가리키는 포인터라서 src가 가리키는 메모리 공간을 수정할 수 없다는 점입니다.

엄밀하게 말해서 char *src ="1234$5678"은 리터럴입니다. 리터럴은 파싱 트리를 이루는 하나의 노드이니 트리의 구조를 변경할 수 없는 C/C++ 언어에서는 변경하지 못하는게 지극히 정상적인 동작입니다.

- CN의 낙서장 / HanIRC:#CN

?의 이미지

Quote:
엄밀하게 말해서 char *src ="1234$5678"은 리터럴입니다.

문자열 상수가 바로 string literal의 번역입니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.