2012-04-19 67 views
7

Tôi đang tạo mảng động với loại dữ liệu int* sử dụng malloc(). Nhưng vấn đề là: làm thế nào để biết kết thúc của mảng? không có tương đương với \0 cho loại dữ liệu int*, do đó, cách thực hiện việc này? vượt qua kích thước như tham số ra của chức năng? Tôi hy vọng điều này là rõ ràng cho bạn. Bất kỳ trợ giúp là rất đánh giá cao.Làm thế nào để biết kết thúc của mảng int *?

+0

Bạn đang sử dụng malloc() glob một số bộ nhớ như malloc (sizeof (int) * ELEMENTS) tôi cho là vậy. Sau đó, bạn thực sự biết rằng ELEMENTS có kích thước, bạn có thể lưu biến và chuyển nó vào các hàm của bạn. –

Trả lời

11

C không quản lý độ dài mảng, như một số ngôn ngữ khác thực hiện.

bạn có thể xem xét một cấu trúc cho việc này:

typedef struct t_thing { 
    int* things; 
    size_t count; 
} t_thing; 

sử dụng:

t_thing t = { (int*)malloc(sizeof(int) * n), n }; 
8

Không có "chính thức" tương đương với \0 cho số nguyên, nhưng bạn chắc chắn có thể sử dụng giá trị của riêng bạn. Ví dụ, nếu số nguyên của bạn đại diện cho khoảng cách sau đó bạn có thể sử dụng -1 (không phải là một khoảng cách hợp lệ) như là một giá trị sentinel để cho biết kết thúc của mảng.

Nếu dãy số nguyên của bạn có thể hợp lý chứa giá trịint, thì bạn có thể trả về kích thước của mảng được phân bổ với tham số bổ sung cho hàm của bạn.

+0

Tôi thích bạn ý tưởng. Tôi cũng sẽ sử dụng '#define EON EOF'. – Jack

0

Bạn có thể sử dụng NULL làm giá trị cuối. Bạn có thể thêm một số nguyên vào một cấu trúc với mảng theo dõi số lượng mục nhập. Hoặc bạn có thể theo dõi kích thước riêng biệt. Bạn có thể làm điều đó tuy nhiên bạn muốn.

+3

Làm thế nào bạn có thể sử dụng NULL làm giá trị kết thúc cho một int []? Các byte 00 00 00 00 sẽ chỉ được hiểu là (int) 0. –

+0

Chính xác. Nếu không có giá trị nào khác trong mảng chứa 0, thì bạn có thể sử dụng 0 làm trình kết thúc. –

+2

Và nếu không có giá trị nào khác chứa 42, bạn có thể sử dụng 42. Câu trả lời ngụ ý cho tôi ít nhất là 'int' bằng cách nào đó là một kiểu nullable, tất nhiên là không. –

0

C không biết đâu là cuối mảng động của bạn. bạn nên nhớ kích thước mà bạn phân bổ cho mảng.

0

khi u cấp phát bộ nhớ với malloc, số byte được phân bổ được lưu trữ ngay trước khi bắt đầu bộ nhớ 'malloc'ated. nếu bạn biết kích thước, bạn cũng biết kết thúc! Điều này được giải thích trong kinh thánh của C, sách K & R. Ước gì tôi cũng có thể cung cấp cho bạn số trang, nhưng bạn sẽ biết nó khi bạn thấy nó.

Các vấn đề liên quan