배열 선언시 크기를 변수로도 받아들일 수 있나요??

new2ind의 이미지

배열 선언시 크기는 항상 상수가 되야한다고 알고 있는데, 크기를
변수로 넣어도 컴파일이 되네요?

int nTmp = 10;
int arrayTmp[nTmp];

gcc 3.2.2를 사용하고 있는데, 위와 같은 문장이 컴파일이 되고
문제없이 실행도 됩니다. vc6나 vc.net은 컴파일이 안됩니다..

이게 정상적인 코드인지(표준으로 채택된건지..) 아니면 문제가
생길 소지가 있는지 궁금합니다..

bear의 이미지

문제의 소지가 있을것 같습니다.

nTmp = 11;
int temp = 0;
temp = arrayTmp[nTmp];

이럴 경우 기본에 배열이 10개만 선언이 되어있기 때문에 에러가 발생할것 같습니다.

직접 돌려 보진 않아서..^^;;

#define ARRAY_MAX 100;

int arrayTmp[ARRAY_MAX];

이게 맞을것 같습니다.

koder의 이미지

비표준에 한표

progcom의 이미지

bear의 이미지

헉 이런 되네요..ㅋㅋ

새로 생성되는 배열도 정상적으로 작동이 되는 군요.ㅋㅋ

몰랐네요.ㅋㅋ

#include <stdio.h>

void main()
{
    int temp = 10;
    int array[temp];

    int temp2 = 11;

    array[temp2] = 14;

    int temp3 = array[temp2];

    printf("teset %d", array[temp2]);
}

정상 컴파일 및 정상 작동합니다.

chadr의 이미지

표준입니다..
단지 VC가 그 표준을 지키지 않아서 문제지요. :twisted:

ps. 예전에 회사 팀장님이 저런식의 코드를 공용라이브러리로 작성을 해놨는데 컴파일이 안되서 보니 저런 문제였더군요..
그래서 new로 바꿔서 작성했던 기억이 있습니다. :evil:

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

익명 사용자의 이미지

Quote:
int nTmp = 10;
int arrayTmp[nTmp];

이건 nTmp가 어짜피 10이기때문에
int arrayTmp[10];
으로 컴파일러가 바꾸겠죠.

테스트해볼라면

Quote:
int nTmp;
cin >> nTmp;
int arrayTmp[nTmp];

라고 해보세요

근데 정말 이게 표준이 된건가요? 헐..

진짜표준? ㅡ,.ㅡ;;;;;;;;;;;;

d3m3vilurr의 이미지

VLA는 표준이 맞습니다. 추가로
"아무위치"에서나 변수의 선언이 가능합니다
C89에서는 { 이후 가장 처음 부분에서만 선언이 가능했죠.
이것도 표준 맞는지는...-_-;;;

VC 6.0은 C99가 나오기 이전에 나왔고, VC2005인가 에서는 지원된다고 하네요

참고로 배열을 선언하는 매개변수값이 자신이 유추가능하지 않는
비확정적 수라면 문제가 생길수 있습니다
(예를들어 매우크다거나...)

죠커의 이미지

Anonymous wrote:
Quote:
int nTmp = 10;
int arrayTmp[nTmp];

이건 nTmp가 어짜피 10이기때문에
int arrayTmp[10];
으로 컴파일러가 바꾸겠죠.

테스트해볼라면

Quote:
int nTmp;
cin >> nTmp;
int arrayTmp[nTmp];

라고 해보세요

근데 정말 이게 표준이 된건가요? 헐..

진짜표준? ㅡ,.ㅡ;;;;;;;;;;;;

VLA는 C언어(C99)에서만 표준입니다.

C++에서는 const int nTemp = 10;인 경우에만 됩니다. 즉 const int nTemp = 10이 C표준 컴파일러와 C++ 표준 컴파일러에서 모두 작동하지만 작동하는 이유는 다릅니다. (아직도 C가 C++의 subset으로 보이십니까?)

그런데 범위가 한정지어져 있습니다. 기술적인 이유로 모든 storage class에서 사용할 수 있는 것은 아닙니다. storage class에 따라서 구현이 달라지게 되는 것은 모두 알 것입니다. (힙, 스택 등으로 말이지요.)

댓글 달기

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