함수와 포인터 관련

asleea의 이미지

#include<stdio.h>
 
void test(char *arg);
 
int main()
{
	char *string = "bbcde";
	test(string);
	printf("%s\n", string);
}
 
void test(char* arg)
{
	*arg = 'a';
}

이거 왜 런타임 에러가 발생하는 걸까요 .ㅜㅜㅜㅜㅜㅜㅜㅜㅜ
함수에서 잘못된 메모리 접근으로 발생하는 것 같은데 전 이해가 안되네요

calmperson의 이미지

string 이라는 포인터가 가리키는 곳에는 "bbcde" 라는 문자열 상수가 들어 있습니다
문자열 상수는 상수이기 때문에 변경할 수 없는데요
그곳을 test 함수에서 'a' 로 바꾸려고 하니 에러가 발생한 거네요

"그때의 두려움을 어찌 잊을 수 있으리오!"
왕이 말했다.
"하지만"
여왕은 말을 이었다.
"메모해 두지 않으면 잊고 말 겁니다."

라스코니의 이미지

사실 이런 문제는 컴파일러가 어떻게 프로그램을 만드느냐를 알아야 파악할 수 있습니다.

컴파일러는 아래 문장을 만나면

char *string = "bbcde";

특정 영역(아마 BSS)에 "bbcde"라는 문자열을 보관해 놓고
프로그램 구동시에 string에 위 특정 영역의 번지를 대입해 놓습니다. 근데 문제는 그 특정영역이라는 곳이 프로그램 내에서 변경할 수 없는 영역이라는 것이지요.

그래서 그 영역을 수정하려는 모든 동작은 segmentation fault 를 발생시킵니다.

마찬가지로 int val[5] = {1, 2, 3, 4, 5};
라는 문장이 있다면 역시 컴파일러는 1, 2, 3, 4, 5를 특정영역에 보관시켜 놓고 프로그램 구동시에 1이 들어있는 주소의 값을 불러와 val[0] = 1, ... , val[4] = 5 이런 식으로 초기화 합니다. 즉 1이라는 값은 특정 영역 어드레스에 보관되어 있죠. 그런데 우리는 1이 담겨 있는 주소의 값을 바꾸려고 하지 않기 때문에(사실은 바꿀수도 없음) 이런 사실을 잘 모르게 되죠.

만약 char string[6] = "bbcde"; 라고 한다면 뜻한대로 동작할 겁니다.

한번 아래의 주소를 각각 찍어 보세요.

char *string1 = "bbcde";
char string2[6] = "bbcde";
 
printf("address %p of string1, address %p of string2\n", string1, string2);

주소의 위치가 좀 다를 거예요.

익명 사용자의 이미지

"" 와 ''의 차이는 마지막에 널문자가 들어가나 안들어가나의 차이라고 봐도 될까요?
그래서 포인터로 생각했을 때 널문자를 통해 전체 문자열을 알 수 있는 것이고..
''의 경우는 char에서 배열 하나에만 넣을 수있는 거같아요...아마도?
그래서 ''로 넣어주려면
char a[i] = 'a';
이게 맞는것인가요? 저도 초보라 잘 모르겠네요...

asleea의 이미지

char *string1 = "bbcde";
char string2[] = "bbcde";

두 문장이 같은 문장이라고 생각해고 있었는데 아니군요

첫 번째 문장은 string1 포인터가 "bbcde"라는 상수를 가리키도록 하는 것이다.

두 번째 문장은 string2 배열 공간에 "bbcde"를 넣어주는 것이고

그래서 첫 번째 문장으로 초기화를 하고 수정을 하려고 하면 에러가 발생하는 군요.

하나 배우고 가네요 .ㅜ 감사합니다.

dariouse의 이미지

맞는 문법인거 같은데

댓글 달기

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