Bạn sử dụng con trỏ.
Cụ thể, bạn sử dụng con trỏ đến địa chỉ và sử dụng cuộc gọi hàm thư viện chuẩn c, bạn yêu cầu hệ điều hành mở rộng vùng lưu trữ để cho phép bạn lưu trữ những gì bạn cần.
Bây giờ, nó có thể từ chối, mà bạn sẽ cần phải xử lý.
Câu hỏi tiếp theo sẽ trở thành - làm cách nào bạn yêu cầu một mảng 2D? Vâng, bạn yêu cầu một mảng con trỏ, và sau đó mở rộng mỗi con trỏ.
Như một ví dụ, hãy xem xét điều này:
int i = 0;
char** words;
words = malloc((num_words)*sizeof(char*));
if (words == NULL)
{
/* we have a problem */
printf("Error: out of memory.\n");
return;
}
for (i=0; i<num_words; i++)
{
words[i] = malloc((word_size+1)*sizeof(char));
if (words[i] == NULL)
{
/* problem */
break;
}
}
if (i != num_words)
{
/* it didn't allocate */
}
này sẽ cho bạn một mảng hai chiều, trong đó mỗi yếu tố words[i]
có thể có kích thước khác nhau, xác định được tại thời gian chạy, cũng như số lượng từ là.
Bạn sẽ cần phải free()
tất cả các bộ nhớ kết quả bằng cách lặp qua mảng khi bạn đang thực hiện với nó:
for (i = 0; i < num_words; i++)
{
free(words[i]);
}
free(words);
Nếu bạn không, bạn sẽ tạo một rò rỉ bộ nhớ.
Bạn cũng có thể sử dụng calloc
. Sự khác biệt là khi gọi quy ước và hiệu lực - calloc
khởi tạo tất cả bộ nhớ thành 0
trong khi malloc
thì không.
Nếu bạn cần đổi kích thước khi chạy, hãy sử dụng realloc
.
Ngoài ra, quan trọng, xem ra cho word_size + 1 mà tôi đã sử dụng. Các chuỗi trong C là zero-terminated và điều này cần thêm một ký tự mà bạn cần tính đến. Để đảm bảo tôi nhớ điều này, tôi thường đặt kích thước của biến số word_size
thành bất kỳ kích thước nào của từ phải là (độ dài của chuỗi như tôi mong đợi) và rõ ràng để lại +1 trong malloc cho số không. Sau đó, tôi biết rằng bộ đệm được phân bổ có thể lấy một chuỗi gồm word_size
ký tự. Không làm điều này cũng tốt - tôi chỉ làm điều đó bởi vì tôi muốn giải thích rõ ràng số không theo một cách rõ ràng.
Ngoài ra còn có một nhược điểm của phương pháp này - Tôi đã thấy rõ ràng đây là lỗi được vận chuyển gần đây. Chú ý tôi đã viết (word_size+1)*sizeof(type)
- tưởng tượng tuy nhiên tôi đã viết word_size*sizeof(type)+1
. Đối với sizeof(type)=1
đây là những điều tương tự nhưng Windows sử dụng wchar_t
rất thường xuyên - và trong trường hợp này, bạn sẽ đặt trước một byte cho số không cuối cùng của bạn thay vì hai - và chúng là các phần tử không được kết thúc loại type
, chứ không phải một byte không. Điều này có nghĩa là bạn sẽ tràn ngập đọc và viết.
Phụ lục: thực hiện theo cách bạn muốn, chỉ xem ra cho những người không có terminators nếu bạn định chuyển bộ đệm cho thứ gì đó dựa vào chúng.
Thuật ngữ của bạn có vẻ hơi khó hiểu ở đây. Tôi hy vọng num_words == 2 ngụ ý rằng cần có hai từ và từ [0] và các từ [1] chứa chúng. Sau đó bạn nên malloc (num_words * sizeof (char *)). –
@Bạn nói đúng. Tôi nghĩ rằng tôi có nghĩa là nó liên quan đến +1 để giải thích cho người kết thúc bằng không. Sửa lỗi :) –
Biến 'num_words' đến từ đâu? –