Có cách nào (khác với malloc
) để tạo mảng có kích thước mà người dùng nhập không?Có cách nào tạo một mảng với độ dài biến đổi trong c?
Trả lời
Một cách là sử dụng VLA (C99 định nghĩa cái được gọi là 'Mảng độ dài biến').
Dưới đây là một ví dụ:
#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);
}
Tất cả phụ thuộc vào trình biên dịch.
Variable-length mảng tự động được cho phép trong
ISO C99
, và như một phần mở rộng GCC chấp nhận chúng trong chế độ C90 và trong C++. Những mảng được khai báo giống như bất kỳ mảng tự động nào khác, nhưng với độ dài không phải là một biểu thức liên tục. Việc lưu trữ được phân bổ tại điểm khai báo và deallocated khi cấp độ brace được thoát. Đối với dụ:
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);
}
Xem this để biết thêm thông tin.
Vâng, đây là một phần nhỏ, nhưng bạn có thể viết mã quản lý vùng heap của riêng mình và gọi hàm phân bổ bộ nhớ của bạn ngoài cái gì đó hơn malloc(). Tôi hy vọng câu trả lời này là thú vị hơn là gây phiền nhiễu.
Nếu bạn không có Vlas hoặc alloca()
, đây là một cực kỳ kludgy, nhưng di động, ngăn xếp dựa trên kỹ thuật:
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);
}
Tôi không đặc biệt khuyên kỹ thuật này, nhưng nó sẽ cung cấp cho bạn cách khác nhau khối kích thước bộ nhớ được phân bổ trên ngăn xếp thay vì đống.
Tôi cho rằng bạn đang cố tránh malloc
vì bạn không biết về realloc
.
Về cơ bản, bạn nên cố gắng thực hiện những gì vector C++ thực hiện. Khi mảng của bạn phát triển đến một kích thước nhất định, realloc
sẽ tăng gấp đôi kích thước của nó.
realloc
sẽ phát triển khối bộ nhớ của bạn nếu có thể và nếu không, nó sẽ malloc
hình mới và sao chép nội dung.
- 1. Độ dài biến đổi
- 2. Lặp lại qua mảng Java có độ dài biến đổi
- 3. Tại sao các hàm C++ có thể tạo mảng có độ dài thay đổi?
- 4. Tạo độ dài biến `alist()`
- 5. Có cách nào để khởi tạo một mảng với các biến không liên tục không? (C++)
- 6. Tạo một véc tơ có độ dài không đổi
- 7. Bộ biến đổi độ dài thay đổi trong f #
- 8. Đi qua một mảng int có độ dài biến như một tham số chức năng trong Objective C
- 9. Lặp lại mảng với một độ dài nhất định?
- 10. Độ dài trong mảng
- 11. Độ dài cố định Mã băm số từ chuỗi có độ dài thay đổi trong C#
- 12. Độ dài mảng với con trỏ
- 13. Mảng JSON có độ dài
- 14. Hiệu suất mảng tự động có độ dài biến đổi C99
- 15. Mảng có độ dài bằng không
- 16. Cách tốt nhất để lưu trữ các mảng có chiều dài biến đổi trong MySQL
- 17. Làm thế nào tôi có thể khởi tạo một mảng String với độ dài 0 trong Java?
- 18. Cách lấy độ dài mảng con trỏ C?
- 19. CSS 3D biến đổi để tạo hình thang có độ dài cạnh
- 20. Làm thế nào để có được chiều dài của một mảng động được tạo trong các cấu trúc trong C?
- 21. Mảng có chiều dài không xác định trong C#
- 22. Làm cách nào để chuyển đổi từ _TCHAR * sang char * khi sử dụng độ dài biến đổi C++?
- 23. Làm cách nào để tránh lỗi "độ dài biến số liệu quá dài" trong SQL Developer?
- 24. Ý nghĩa của một mảng có độ dài 0 trong C là bao nhiêu?
- 25. Viết chuỗi vào mảng byte có độ dài cố định trong C#
- 26. Làm cách nào để tìm độ dài của mảng "char *" trong C?
- 27. Làm thế nào để có được độ dài của một mảng trong C? Là "sizeof" một giải pháp?
- 28. Có chức năng tiêu chuẩn nào trong C có thể trả về độ dài của một mảng không?
- 29. Có bản đồ có độ dài khóa biến đổi trong thế giới Java không?
- 30. thực hành tốt nhất để trả về một chuỗi có độ dài thay đổi trong c
Bạn cần một trình biên dịch hỗ trợ nó và các tùy chọn phù hợp được bật. Nhưng hãy lưu ý đến những hạn chế của VLAs trước khi bạn làm điều đó. – Mysticial
Tại sao bạn không muốn sử dụng 'malloc()'? –
tôi muốn biết nếu có cách nào khác để làm như vậy. – rippy