[초보질문]배열초기화

yoonseok83의 이미지

char value[30] = {0,};

char value[30] ;
value[0] = 0;

두개 모두 초기화로 쓰일 수 있다고 알고 있는데

1.
char value[30] = {0,};
while(1) {
strcpy(value, "abc");
}

2.
char value[30] ;
while(1) {
value[0] = 0;
strcpy(value, "abc");
}

1번 코드가 2번에서 초기화 한거 같은 효과가 있는 코드인가요?

mirheekl의 이미지

일단 strcpy를 할 경우, 배열 초기화는 전혀 해주지않아도 됩니다. 그냥 문자열을 타겟에 무조건 복사해주니까요. 초기화하든 안하든 결과가 똑같습니다. 지금 상태에서는 1번이고 2번이고 초기화 자체가 그냥 오버헤드입니다. (물론 그럼에도 불구하고 실수를 방지하기 위해서 1번처럼 초기화를 해주시는게 좋겠죠.)

제가 보기엔 기존에 저장되어 있는 문자열이 이용되는 strcat같은걸 쓰셔야 정확한 예제가 되지 않을까 합니다. strcat을 쓸 경우 1번은 곧 메모리 에러가 나지만 2번은 정상적으로 무한루프에 빠지겠지요.

하지만, 두 함수 다 타겟의 메모리사이즈를 지정하지 않기 때문에 문제의 소지가 있는 함수들이므로, 가급적 위 함수들은 사용하지 않으시는 게 좋을듯 합니다. 컴파일러별로 타겟의 버퍼사이즈를 입력하게 되어 있는 변경된 함수를 사용하시거나, STL이나 MFC등이 제공하는 자료구조를 사용하시면 좋을듯 합니다.

--
This is for you new people. I have just one rule :
Everyone fights, no one quits. If you don't do your job, I'll shoot you myself. Do you get me?

--

yoonseok83의 이미지

[긍정의 힘을 믿는다.]

int life()
{
조건과 반복
return 1;
}

litnsio2의 이미지

char value[30] = {0,};

char value[30] ;
value[0] = 0;

첫번째는 배열의 원소를 0으로 초기화 하는 것이고,
두번째는 배열의 원소를 쓰레기 값으로 초기화 후에 첫번째 원소를 0으로 하는 것입니다.

char value[30] = {0,}; 하고 (사용자가 초기화)
char value[30]; 만 (컴파일러가 초기화)

초기화이고

value[0] = 0; 은 대입입니다.

yoonseok83의 이미지

char value[30];은 컴파일러에서 쓰레기값으로 초기화 하는 것이고, value[0] = 0;은 초기화라기 보다는 대입이군요. 감사합니다.
[긍정의 힘을 믿는다.]

int life()
{
조건과 반복
return 1;
}

auditory의 이미지

1, 2 두가지가 effectively 똑같은 일을 하고 있습니다.

char value[30] = {0,};

라는것도 값이 주어진 원소만 해당값으로 초기화하고,
나머지는 건드리지 않는것으로 알고 있습니다.

결국

char value[30];
value[0] = 0;

과 똑같아지게 될 것 같습니다.

vacancy의 이미지


아닙니다.
첫번째 경우, 나머지도 0이 됩니다. ;;

auditory의 이미지

아.. 값이 없는 원소는 0으로 초기화 되는군요..

0이 아닌값으로는 초기화 되지 않는다는것과 착각했습니다.. ^^

select99의 이미지

1.은 배열의 초기화이고..
2.는 스트링의 초기화입니다.
1은 해당 배열전체가 0으로 초기화 되어있고 2는 물론 첫번째만 0 이죠..
배열의 Size(Target size)를 이미 알고 있고 대입할 문자열의 크기도 알기때문에..해당함수를 사용함에있어 문제는 없습니다.
size를 모른다는 가정이 있다면 적절히 size 를 체크하시고.. 메모리 할당 하시면됩니다.

yoonseok83의 이미지

스트링 초기화라고 보는 것이 정확하다고 생각합니다.
평소 value에 들어있는 문자열을 초기화 할 때 자주 사용하여 질문을 오렸던 겁니다.
감사합니다.
[긍정의 힘을 믿는다.]

int life()
{
조건과 반복
return 1;
}

baboda4u의 이미지

딴지거는거 아니지만요...^^;;

실제로 사용하는 코드에서 발취한건가요? -_-?

그렇다면...while(1) -> 언제 빠져 나옵니까? ^^; 그리고

배열 크기가 30인대 앞 3자리만 초기화 하겠다는 의도면..왜? while에 들어 가 있을가요? -_-?

while문 안의 내용에서 보면 포인터 이동도 없으니...같은 자리에 계속 abc만 쓰지 않나요? ^^?

value는 배열의 제일 앞 포인터를 가르키기때문이죠...^^? 결론은...이코드가 실제로 사용되는

실용코드에서 발취 해오신건가해서 질문 드립니다. ^^;;

============================
Stay Hungry, Stay Foolish

============================
Stay Hungry, Stay Foolish

yoonseok83의 이미지

당연히 실제 코드에서 사용하진 않아요ㅎㅎ
[긍정의 힘을 믿는다.]

int life()
{
조건과 반복
return 1;
}

댓글 달기

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