배열 선언시에 int opt[n] 이런식으로도 선언을 할수 있는건가요??

faraplay의 이미지

제가 어느.싸이트를 돌아가니다가 ... 이런 코드를 보왔습니다.

#include <stdio.h>
int n;
int denom[]={1,2,4,5,20,25};
int coinCounter(int n);
int main(){
 
    printf("Please Enter a Number : ");
    scanf("%d",&n);
    int coinmin,orin,i;
    orin=n;
    i=coinmin=0;
    for(i=(sizeof(denom)/4)-1;i>=0;i--){
 
        coinmin =coinmin+n/denom[i];
        n=n%denom[i];
    }
 
    printf("Coin Min By Greedy Algorithm : %d\n",coinmin);
    printf("Dynamic Algorithm : %d\n",coinCounter(orin));
    return 0;
}
int coinCounter(int n){
    int opt[n];
    int largest[n];
    int i,j,a;
    i=j=0;
    for(j=1;j<=n;j++){
 
        opt[j]=10000;
        //printf("xxn");
        for(i=(sizeof(denom)/4)-1;i>=0;i--){
 
            if(denom[i]==j){
 
                opt[j]=1;
                largest[j]=j;
            }
            else if(denom[i]<j){
                a=opt[j-denom[i]]+1;
            }
            if(a<opt[j]){
                opt[j]=a;
                largest[j]=denom[i];
            }
        }
 
    }
    return opt[n];
}

그리드 알고리즘과 다이나믹 알고리즘에 대한 거였는데... 소스 결과는 잘못된 결과가 나오긴 하는데 제가 궁금한건 소스 어느 부분이 잘못되어서

결과가 이상하게 나오느냐는 것이 아니라

int coinCounter(int n){
    int opt[n];
    int largest[n];
    int i,j,a;

이부분이 궁금합니다. 제가 알기로는 저 소스에서 n는 const int 형(상수)이 들어가야 되는 걸로 알고 있는데.. 제가 잘못 알고 있는건가요??

변수를 받아서 크기를 정하기 위해선 malloc를 사용해야 되는걸로 알고있는데... 저부분이 되는걸 보니 이해가 되질 않습니다.ㅠㅠ

설명 해주시면 감사하겠습니다. ㅠㅠ

oosap의 이미지

C99 스펙의 6.7.5.2 Array declarators 에 설명과 예시가 있네요. 예시만 옮겨보니 아래와 같습니다.
VLA(Variable Length Array) 라고 하는 것이고 자동변수로 쓰이는건 허용되지만 전역이나 함수 내부 정적 변수로는 허용되지 않는 것 같습니다.

extern int n;
int A[n];                      // invalid: file scope VLA
extern int (*p2)[n];           // invalid: file scope VM
int B[100];                    // valid: file scope but not VM
void fvla(int m, int C[m][m]); // valid: VLA with prototype scope
void fvla(int m, int C[m][m])  // valid: adjusted to auto pointer to VLA
{
  typedef int VLA[m][m];       // valid: block scope typedef VLA
  struct tag {
    int (*y)[n];               // invalid: y not ordinary identifier
    int z[n];                  // invalid: z not ordinary identifier
  };
  int D[m];                    // valid: auto VLA
  static int E[m];             // invalid: static block scope VLA
  extern int F[m];             // invalid: F has linkage and is VLA
  int (*s)[m];                 // valid: auto pointer to VLA
  extern int (*r)[m];          // invalid: r has linkage and points to VLA
  static int (*q)[m] = &B;     // valid: q is a static block pointer to VLA
}

이 답변을 제출하려고 '저장' 버튼을 누르니 사이트에서 응답이 없어져 버리더군요.. 파워가 나간 타이밍이 절묘했었습니다. 깜짝 놀랐었어요..

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

댓글 달기

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