2012-12-22 45 views
9

thể trùng lặp:
How to find the sizeof(a pointer pointing to an array)C, malloc() và chiều dài mảng

tôi đang học làm thế nào để tạo ra một mảng động trong C, nhưng đã gặp sự cố tôi có thể 't tìm ra.

Nếu tôi sử dụng mã:

int num[10]; 
for (int i = 0; i < 10; i++) { 
    num[i] = i; 
} 
printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0])); 

tôi nhận được kết quả:

sizeof num = 40 
sizeof num[0] = 4 

Đây là những gì tôi mong đợi xảy ra. Tuy nhiên nếu tôi malloc kích thước của mảng như:

int *num; 
num = malloc(10 * sizeof(int)); 
for (int i = 0; i < 10; i++) { 
    num[i] = i; 
} 
printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0])); 

Sau đó, tôi nhận được đầu ra:

sizeof num = 8 
sizeof num[0] = 4 

Tôi tò mò muốn biết lý do tại sao kích thước của mảng là 40 khi tôi sử dụng cố định phương pháp chiều dài, nhưng không phải khi tôi sử dụng malloc().

+0

'num' là con trỏ tới int trong trường hợp thứ hai và kích thước của nó phụ thuộc vào máy tức là 32 bit, nó là 4 byte và cho 64 bit là 8 byte. Trong trường hợp 1 chữ số không phải là con trỏ, nó là' cơ sở address' của mảng vì vậy 'sizeof()' cho tổng kích thước của mảng. . – krpra

Trả lời

16

Trong trường hợp thứ hai, num không phải là mảng, là một con trỏ. sizeof cho bạn kích thước của con trỏ, có vẻ là 8 byte trên nền tảng của bạn.

Không có cách nào để biết kích thước của mảng được phân bổ động, bạn phải lưu nó ở một nơi khác. sizeof xem loại, nhưng bạn không thể có được loại mảng hoàn chỉnh (loại mảng có kích thước được chỉ định, như loại int[5]) từ kết quả của malloc theo bất kỳ cách nào và không thể áp dụng đối số sizeof cho loại không hoàn chỉnh , như int[].

+0

bạn biết chức năng 'free' hoạt động, trình biên dịch hay O/S như thế nào để lưu trữ/theo dõi các khối được phân bổ, sau đó chỉ cung cấp con trỏ, nó có thể được giải phóng không cần số' num', chức năng cho người dùng để lấy 'num' này từ bản ghi heap? Vì nó đã ở đó ... bất cứ khi nào người dùng gọi 'miễn phí (ptr) ' –

+0

@BuddhikaChaturanga Xin lỗi tôi không chắc tôi đã hiểu chính xác: bạn hỏi tại sao không triển khai hiển thị chi tiết về khối phân bổ bộ nhớ? Giống như, cho một con trỏ có được thông tin? – effeffe

+0

yeah ... Nếu họ có thông tin về dữ liệu được phân bổ động, nếu họ sử dụng nó cho 'miễn phí' thì tại sao họ không thể cung cấp chức năng cho người dùng (Nhà phát triển) để có được thông tin đó ... :) –

2

Kích thước thứ hai là kích thước của con trỏ, trong máy của bạn - có thể là 64 bit -, là 8 byte.

Bạn không thể sử dụng sizeof() để khôi phục kích thước của cấu trúc được phân bổ động, nhưng bạn có thể làm như vậy đối với các cấu trúc được phân bổ tĩnh.

4

Mảng không phải là con trỏ (phân rã thành con trỏ trong một số trường hợp, không phải ở đây).

Thứ nhất là một mảng - vì vậy sizeof cho bạn kích thước của mảng = 40 byte.

Thứ hai là một con trỏ (không phân biệt số lượng phần tử trỏ đến) - sizeof cung cấp cho bạn sizeof(int*).

0

Nếu bạn muốn biết kích thước của thứ gì đó bạn đã phân bổ, thì bạn cần phải "nhớ" chính mình, vì mã của bạn đã phân bổ. Nếu mã của bạn không thực hiện phân bổ, thì không có cách nào [theo nghĩa tiêu chuẩn] để tìm ra bộ nhớ lớn như thế nào mà con trỏ trỏ đến. Bạn chỉ cần "biết" một số cách khác.

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