배열 선언 위치에 따른 에러..

shs0917의 이미지

#incldue <stdio.h>

int main(void){
  int n;
  
  printf("n: ");
  scanf("%d", &n);
  printf("%d\n",n);

  int array[5];
 
  return 0;
}

여기에서 배열 선언 위치 때문에 에러가 나는데요..
이게 문법적으로 틀린 문장이 아닌거 같은데..
답변 부탁 드릴께요..
참고로 레댓9에서 gcc로 컴파일 했습니다.
세벌의 이미지

int array[5]; 를 printf("n "); 의 위로 옮기면 될 겁니다. C++에서는 에러가 안날지 모르지만 C에서는 에러입니다.

verena의 이미지

c의 특성인지 아닌지는 c를 이젠 안써서 모르겠지만 자동변수의 선언과 스택과 관련한 컴파일러의 제약인듯합니다.

일반적으로 선언을 하는 타이밍이 최초로 정의[보통 값을 대입시키거나 선언이 아닌 다른 구문이 있는 경우...]가 일어나는곳까지로 정하는 기법을 사용하는듯 합니다.

그래서 컴파일러가

printf("n: "); 이전까지만 선언의 블럭 혹은 구문이라고 인식을 하고 파싱을 하게 되어서 이 이후에 선언된 식별자에 대해선 parse error를 내게 됩니다.

shs0917의 이미지

제가 너무 알아보지도 않고 질문을 올린거 같아서..

죄송스럽습니다..

허접 질문에도 답변 주셔서 감사합니다..

C++에서만 가능하더군요...

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

eminency의 이미지

참고로 gcc 3.x대부터는 C99를 지원하므로 저 코드도 아무 문제없이 컴파일 됩니다...

노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5

shs0917의 이미지

앗.. 제가 쓰고 있는게.. 3.x 버전이 아니군요..

3.x버전을 설치해야 겠네요.. 감사..

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

for1003의 이미지

gcc 3.x부터 C99를 지원하기 때문에 선언을 실행문 중간에 쓰셔두 된다구 하셨는데요..
그건 C99를 지원하기 때문이 아니고... gcc 컴파일러가 개발자의 편의를 위해서 넣어둔 것으로 봐야할 것 같습니다..
(C99에서 그런 내용을 본적이 없습니다...)

그리고 C로 개발하는 상황이라면 선언은 실행문 앞에 쓰는 것이 적합할 것으로 보이고 굳이 실행문 중간에 선언을 쓰고 싶다면 C++ 스타일로 코딩하는게 C++ 코딩을 하는 것이 낫지 않을까요?

ㅡ,.ㅡ;;의 이미지

중간에 선언을한다는건 선언이 아니다는 뜻이 아닐까요..

그게 가능하다면.. 동적할당 malloc 가 필요 없게되죠..완전히는 아니지만..ㅡㅡ;

그러나 선언부분에 대활호를 해보십시요.. 아마그렇게 하면 된다고 기억하고
있습니다.

#incldue <stdio.h> 

int main(void){ 
  int n; 
  
  printf("n: "); 
  scanf("%d", &n); 
  printf("%d\n",n); 

  {
     int array[5]; 
     
     어쩌고 저쩌고..코딩..
  }
  return 0; 
} 


----------------------------------------------------------------------------

shs0917의 이미지

답변 감사한데요..
main()
{
.
.
.

{
선언..
}
.
.
.
이런식으로 하면 스코프 규칙에 따라 저 블럭 안에서만 영향력일 가지는거
아닌가요?

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

전웅의 이미지

for1003 wrote:
gcc 3.x부터 C99를 지원하기 때문에 선언을 실행문 중간에 쓰셔두 된다구 하셨는데요..
그건 C99를 지원하기 때문이 아니고... gcc 컴파일러가 개발자의 편의를 위해서 넣어둔 것으로 봐야할 것 같습니다..
(C99에서 그런 내용을 본적이 없습니다...)

C99 이전에도 여러 컴파일러들이 확장으로 지원해 오던 기술임에는 틀림
없지만, C99 에서는 공식적으로 선언과 문장을 섞어쓸 수 있습니다. 10월
세미나에서도 말씀드렸지만 함수 내에서 logical block 을 나눌 때 유용할
수 있습니다.

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

전웅의 이미지

ㅡ,.ㅡ;; wrote:
중간에 선언을한다는건 선언이 아니다는 뜻이 아닐까요..

그게 가능하다면.. 동적할당 malloc 가 필요 없게되죠..완전히는 아니지만..ㅡㅡ;

어떤 점에서 그렇게 생각하시죠?

#incldue <stdio.h> 

int main(void)
{ 
    int n; 
  
    // codes
    
    int array[5]; 

    // codes
    
    return 0; 
}

int array[5]; 를 code 사이에 허락하는 것과 int array[n]; (즉, VLA) 를
허락하는 것은 분명 다릅니다.

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

전웅의 이미지

shs0917 wrote:
답변 감사한데요..
main()
{
.
.
.

{
선언..
}
.
.
.
이런식으로 하면 스코프 규칙에 따라 저 블럭 안에서만 영향력일 가지는거
아닌가요?

맞습니다.

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

shs0917의 이미지

사실 코드 중간에 배열을 선언하려는 의도가

int n;

scanf("%d", &n);

int array[n][n];을 하기 위해서였죠..

꼼수 쓰려고 했는데 안되다니.. 쩝..ㅡㅡㅋ

C에서 편한 방법 없을까요?

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

죠커의 이미지

shs0917 wrote:
사실 코드 중간에 배열을 선언하려는 의도가

int n;

scanf("%d", &n);

int array[n][n];을 하기 위해서였죠..

꼼수 쓰려고 했는데 안되다니.. 쩝..ㅡㅡㅋ

C에서 편한 방법 없을까요?

malloc과 free를 쓰세요. :-P

보기 좋지 않다면 매크로나 함수로 만들어서 쓰시구요.

댓글 달기

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