2010-04-08 93 views
5

Câu hỏi c nhanh: Cách biết độ dài của char * foo []?Làm thế nào để có được chiều dài của char **?

Cảm ơn.

+4

là nó bị hủy bỏ –

+2

'char ** foo' không giống với' char * foo [] 'http://stackoverflow.com/questions/2448204/why-does-this-generate-a-segmentation-fault/2448255 # 2448255 –

+0

Câu hỏi không có ý nghĩa gì nếu không có ngữ cảnh. 'char * foo []' có thể có nghĩa là hoàn toàn khác nhau trong các ngữ cảnh khác nhau. – AnT

Trả lời

11

Bạn không thể. Không phải không biết gì về nội dung bên trong con trỏ, hoặc lưu trữ dữ liệu đó trước thời hạn.

+3

+1, mặc dù tôi tự hỏi có bao nhiêu luân hồi của câu hỏi này sẽ được trả lời mà không trỏ đến nhiều bản sao. –

6

Bạn có nghĩa là số chuỗi trong mảng?

Nếu mảng được cấp phát trên ngăn xếp trong cùng một khối, bạn có thể sử dụng thủ thuật sizeof(foo)/sizeof(foo[0]).

const char *foo[] = { "abc", "def" }; 
const size_t length = sizeof(foo)/sizeof(foo[0]); 

Nếu bạn đang nói về argv truyền cho chính, bạn có thể nhìn vào các thông số argc.

Nếu mảng được cấp phát trên heap hoặc được chuyển vào một hàm (nơi nó sẽ phân rã thành một con trỏ), bạn sẽ không may, trừ khi ai đó phân bổ nó cho bạn.

2

Nếu mảng được phân bổ tĩnh, bạn có thể sử dụng chức năng sizeof(). Vì vậy, sizeof(foo)/sizeof(char *) sẽ hoạt động. Nếu mảng được tạo động, bạn gặp rắc rối! Độ dài của một mảng như vậy thường được lưu trữ một cách rõ ràng.

CHỈNH SỬA: janks dĩ nhiên là đúng, sizeof là toán tử.

Ngoài ra, điều đáng chú ý là C99 cho phép sizeof trên các mảng có kích thước thay đổi. Tuy nhiên các trình biên dịch khác nhau thực hiện các phần khác nhau của C99, vì vậy một số cảnh báo được bảo hành.

+0

sizeof là toán tử, không phải là hàm. Sử dụng sizeof trên một biểu thức (trái với tên của một loại) thậm chí không cần niềng răng. – janks

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