사용자가 입력 한 크기의 배열을 만드는 방법은 있습니까 (malloc
제외)?길이가 가변 인 배열을 만드는 방법이 있습니까?
7
A
답변
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
새로운 내용을 복사합니다.
관련 문제
- 1. 가변 길이가 int 배열 인 문자열?
- 2. 가변 길이 데이터와 길이가 0 인 배열의 이진 직렬화는 안전합니까?
- 3. 초기화 된 배열을 만드는 간단한 방법이 있습니까?
- 4. Maple : 길이가 L 인 배열을 가지고 있습니다. 반복없이 가능한 모든 순열을 사용하여 배열을 만드는 방법은 무엇입니까?
- 5. 가변 크기의 문자 배열을 저장할 배열을 만드는 방법은 무엇입니까?
- 6. 길이가 0 인 인수가
- 7. 길이가 0 인 일치
- 8. PyTables에서 가변 길이의 중첩 배열을 만드는 방법은 무엇입니까?
- 9. System.IO.Log SequenceNumbers의 길이가 가변적 인 이유는 무엇입니까?
- 10. 길이가 tsql 인 하위 문자열
- 11. 이 데이터 유형에 대해 가변 C 배열을 만드는 방법은 무엇입니까?
- 12. 가변 광고 배너 크기를 사용하는 방법이 있습니까?
- 13. 길이가 다른 3 차원 배열을 만듭니다.
- 14. rs.exe에 배열을 전달하는 방법이 있습니까
- 15. 모서리의 고정 길이가 최대 인 평면 그래프
- 16. 구문상의 이유 때문에 두 변수 대신에 길이가 2 인 배열을 사용하는 것이 가치가 있습니까?
- 17. Java : 정적 가변 변수를 사용할 올바른 방법이 있습니까?
- 18. C++ : 정적 배열을 인라인으로 정의하는 방법이 있습니까?
- 19. 가변 크기 배열에 대한 고정 구조체 머리글을 만드는 방법
- 20. 길이가 0 인 recv()가 유효합니까?
- 21. 콘텐츠의 높이가 가변 인 코다 슬라이더 탐색을 만들 수 있습니까?
- 22. 파이썬에서 csv에 길이가 다른 배열을 작성하십시오.
- 23. C# : 생성자 매개 변수 배열을 사용하여 개체 배열을 만드는 LINQ 방법이 있습니까?
- 24. Sourcesafe로 CI를 만드는 방법이 있습니까
- 25. 글로벌 라벨을 만드는 방법이 있습니까
- 26. Android에서 캘린더를 만드는 방법이 있습니까?
- 27. 파이썬으로 비디오를 만드는 방법이 있습니까?
- 28. 오리엔테이션없이 UIImage를 만드는 방법이 있습니까?
- 29. 문자열에서 SyndicationFeed를 만드는 방법이 있습니까?
- 30. 비트 맵의 ColorPalette에 길이가 0 인 배열이 있습니다.
지원하는 컴파일러가 필요하며 올바른 옵션이 활성화되어 있어야합니다. 그러나 VLA를 사용하기 전에 VLA의 단점에 유의하십시오. – Mysticial
왜'malloc()'을 사용하지 않으시겠습니까? –
그렇게 할 수있는 다른 방법이 있는지 알고 싶습니다. – rippy