char* 의 초기값 관련해서 궁금합니다.

호기심천국의 이미지

char* str;
str = malloc(512);
str[0] = '1';
str[1] = 0x0;
printf("%s", str);

char* str = "2";
str[0] = '1';
str[1] = 0x0;
printf("%s", str);

char* 형은 문자열 상수로 수정이 안되는 것으로 알고있는데요
위 첫번째 코드는 사실 수정?이 일어났는데도 정상적으로 출력이 가능하고 두번째 코드는 오류가 발생합니다.
두번째 코드에서 두번째 라인에 str = malloc(); 을 해주면 첫번째 코드처럼 1이 출력되지만, 당연히 초기 값인 2는 사라지더군요.
realloc을하면 역시 오류가 발생합니다.

결국 초기값을 주느냐 안주느냐에 따라서 다른것 같은데, 정확히 어떤점이 다른지 알고싶습니다.
(bss영역, data영역에 기록되는 차이때문인가요?)

chocokeki의 이미지

char* 형은 문자열 상수로 수정이 안되는 것으로 알고있는데요
-> 이게 잘못되었습니다

str은 그냥 변수입니다
변수의 type이 int냐 double이냐 이런거로 구분하시면 됩니다

"2" 이게 교재에 나와있는 리터럴이고 수정하시려고 하면 안됩니다

호기심천국의 이미지

감사합니다. "2"가 리터럴이었다고 하니 궁금했던 부분 대부분이 해결되네요.

그런데 추가적으로 궁금한게있습니다.

str[] = "2" 인 경우에도 결국 "2"가 리터럴이라면 수정 불가능해야 할 것 같은데

str[] = "2"로 선언한 후에, str[0]을 수정 가능한 이유는 뭔지 알려주실 수 있나요?

exception의 이미지

char str[] = "2";는 사실 char str[2] = {'2', '\0'};와 같습니다.
겉보기에는 literal처럼 보이지만 실제로는 그렇지 않고 그냥 배열 초기값을 주었을 뿐인 것이죠. 딱 이 경우에만 적용되는 규칙입니다.

웬 프로그래밍 언어에 이렇게 일관성 없는 문법이 있느냐고 생각할 수도 있지만... 문자 배열의 초기화는 C언어 프로그램에서 빈번하게 일어나는 일이고, 아무래도 shortcut이 있을 필요는 있었겠죠.

그럼에도 불구하고 언어 문법을 공부하려는 사람들에게 혼동을 유발한다는 사실을 부정할 생각은 없습니다.

호기심천국의 이미지

궁금한점 해결해주셔서 감사합니다~!

라스코니의 이미지

str[] = "2"로 선언한 후에, str[0]을 수정 가능한가요? 안될것 같은데요?

호기심천국의 이미지

제 환경에서는 정상적으로 수행되네요

gcc version 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC)

int main(){
        char str[] = "2";
        str[0] = '1';
        printf("%s",str);
}
 
결과 : 1

라스코니의 이미지

아 char str* = "2" 가 아니었군요.

댓글 달기

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