2012-09-11 5 views
7

사용자가 입력 한 크기의 배열을 만드는 방법은 있습니까 (malloc 제외)?길이가 가변 인 배열을 만드는 방법이 있습니까?

+2

지원하는 컴파일러가 필요하며 올바른 옵션이 활성화되어 있어야합니다. 그러나 VLA를 사용하기 전에 VLA의 단점에 유의하십시오. – Mysticial

+9

왜'malloc()'을 사용하지 않으시겠습니까? –

+0

그렇게 할 수있는 다른 방법이 있는지 알고 싶습니다. – rippy

답변

2

한 가지 방법은 VLA (C99은 '가변 길이 어레이'라는 것을 정의합니다)를 사용하는 것입니다. 그것은 모든 컴파일러에 의존

#include <stdio.h> 

int use_a_vla (int n) 
{ 
    int vla[n]; /* Array length is derived from function argument. */ 

    vla[0] = 10; 
    vla[n-1] = 10; 

    return 0; 
} 

int main (void) 
{ 
    int i; 

    scanf ("%d", &i); /* User input. */ 

    use_a_vla (i); 
} 
6

: 여기

는 일례이다.

가변 길이 자동 배열은 ISO C99에서 허용하고 GCC은 C C90 모드와 그들을 받아들이는 확장으로 ++된다. 이러한 배열 은 다른 자동 배열과 마찬가지로 선언되지만 길이는 이며 상수식이 아닙니다. 저장소는 선언 시점에 할당되고 중괄호 수준이 종료 될 때 할당이 취소됩니다. 예를 들어 :

FILE * 
concat_fopen (char *s1, char *s2, char *mode) 
{ 
    char str[strlen (s1) + strlen (s2) + 1]; 
    strcpy (str, s1); 
    strcat (str, s2); 
    return fopen (str, mode); 
} 

자세한 내용은 this를 참조하십시오.

0

글쎄, 이것은 현학적인데, 자신 만의 힙 관리 코드를 작성하고 메모리 할당 함수를 malloc() 이외의 다른 함수로 호출 할 수 있습니다. 나는이 대답이 짜증나 기보다는 재미 있기를 바란다. 당신이 블라스 또는 alloca()이없는 경우

1

, 여기에 매우 미봉책입니다 만, 휴대용, 스택 기반 기술이다 :

int foo(int size) 
{ 
    if (size <= 64*1024) 
    { 
     unsigned char arr[64*1024]; 
     return bar(arr, size); 
    } 
    else if (size <= 1*1024*1024) 
    { 
     unsigned char arr[1*1024*1024]; 
     return bar(arr, size); 
    } 
    else if (size <= 64*1024*1024) 
    { 
     unsigned char arr[64*1024*1024]; 
     return bar(arr, size); 
    } 
    else 
     return -1;  // Assume it's too big 
} 

int bar(unsigned char arr[], int size) 
{ 
    ...your code goes here... 
} 

int maincode(int size) 
{ 
    // Invoke bar() indirectly, allocating an array 
    // on the stack of at least 'size' bytes 
    return foo(size); 
} 

나는 특히이 방법을 권장하지 않지만, 그것은 당신에게 다르게 줄 것이다 - 힙 대신 스택에 할당 된 크기의 메모리 블록.

0

만약 realloc에 대해 잘 모르기 때문에 malloc을 피하려고한다고 가정합니다.

기본적으로 C++ 벡터가하는 일을 대략 수행해야합니다. 배열이 특정 크기가되면 realloc 크기의 두 배가됩니다.

realloc은 가능하면 메모리 블록이 커지며 가능한 경우 불가능할 경우 malloc 새로운 내용을 복사합니다.

관련 문제