2010-09-24 44 views

Trả lời

16

Không có. Đó là bởi vì mảng sẽ phân rã thành con trỏ tới phần tử đầu tiên khi chuyển đến hàm.

Bạn phải tự vượt qua độ dài hoặc sử dụng thứ gì đó trong chính mảng đó để biểu thị kích thước.


Đầu tiên, tùy chọn "truyền độ dài". Gọi hàm của bạn với một cái gì đó như:

int setIncludes (char *includes[], size_t count) { 
    // Length is count. 
} 
: 
char *arr[] = {"Hello,", "my", "name", "is", "Pax."}; 
setIncludes (arr, sizeof (arr)/sizeof (*arr)); 
setIncludes (arr, 2); // if you don't want to process them all. 

Một phương pháp trọng điểm sử dụng một giá trị đặc biệt ở cuối để cho thấy không có nhiều yếu tố (tương tự như \0 ở phần cuối của một mảng C char để chỉ ra một chuỗi) và sẽ là một cái gì đó như thế này:

int setIncludes (char *includes[]) { 
    size_t count = 0; 
    while (includes[count] != NULL) count++; 
    // Length is count. 
} 
: 
char *arr[] = {"Hello,", "my", "name", "is", "Pax.", NULL}; 
setIncludes (arr); 

một phương pháp tôi đã nhìn thấy sử dụng (chủ yếu là đối với mảng không thể thiếu) là sử dụng mục đầu tiên như độ dài (tương tự như Rexx biến gốc):

int setIncludes (int includes[]) { 
    // Length is includes[0]. 
    // Only process includes[1] thru includes[includes[0]-1]. 
} 
: 
int arr[] = {4,11,22,33,44}; 
setIncludes (arr); 
+0

Vì vậy, như giá trị tối đa? –

+1

Giả sử bạn là người đầu tiên, @Mohit, sắp xếp. Thủ thuật 'sizeof' sẽ luôn cho bạn độ dài của mảng (giả sử nó chưa bị phân rã thành con trỏ). Sự linh hoạt là bạn không bị giới hạn khi truyền giá trị đó. Nếu bạn có một mảng có kích thước 1000 nhưng chỉ có 20 giá trị hữu ích trong nó, bạn có thể vượt qua 20 là kích thước. – paxdiablo

+1

Tại sao bạn truyền một mảng 'int' vào một hàm mong đợi một mảng' char * '? – caf

0

Bạn phải biết kích thước theo cách này. Một cách sẽ là để vượt qua kích thước như một tham số thứ hai. Một cách khác là để đồng ý với người gọi, người đó nên bao gồm một con trỏ null làm phần tử cuối cùng trong mảng con trỏ được truyền.

2

Bạn có hai lựa chọn:

  1. Bạn có thể bao gồm một tham số thứ hai, tương tự như:

    int main(int argc, char**argv)

  2. ... hoặc bạn có thể tăng gấp đôi -null chấm dứt danh sách:

    char* items[] = { "one", "two", "three", NULL }

+3

Điều thú vị là, đối với trường hợp đặc biệt của 'chính (int argc, char * argv [])', tiêu chuẩn C yêu cầu người gọi vừa chuyển số vừa phải * và * bao gồm một con trỏ NULL tại 'argv [argc]'. Thắt lưng và treo, đúng, nhưng nó có công đức. – RBerteig

1

Không có cách nào để xác định kích thước của một mảng tùy ý như thế này trong C. Nó yêu cầu thông tin thời gian chạy không được cung cấp theo cách tiêu chuẩn.

Cách tốt nhất để hỗ trợ điều này là lấy chiều dài của mảng trong hàm như một tham số khác.

-2

Còn hàm strlen() thì sao?

char *text= "Hello Word"; 
    int n= strlen(text); 
OR 
    int n= (int)strlen(text); 
Các vấn đề liên quan