2010-06-09 19 views
5

Nếu tôi có thể vượt qua trong một mảng có kích thước phổ biến:Trả về một mảng có kích thước đã biết trong C++?

void fn(int(*intArray)[4]) 
{ 
    (*intArray)[0] = 7; 
} 

lý do tại sao tôi không thể trả lại một:

int intArray[4] = {0}; 
int(*)[4] fn() 
{ 
    return &intArray; 
} 

ở đây, ")" trong "(*)" tạo ra " lỗi cú pháp :)".

+0

Bạn đang chuyển một con trỏ tới một mảng có kích thước đã biết. Trong C++, một tham chiếu có thể tốt hơn vì nó sẽ hoạt động như một mảng, thay vì phải dereference nó. –

Trả lời

4

Các [4] đi sau tên hàm, giống như nó đi sau tên biến trong một định nghĩa biến:

int (*fn())[4] 
{ 
    return &intArray; 
} 

Do đây là cú pháp rất mơ hồ, dễ bị được gây nhầm lẫn cho tất cả mọi người đọc nó, tôi sẽ khuyên bạn nên trả lại mảng như là một đơn giản int*, nếu bạn không có bất kỳ lý do đặc biệt tại sao nó phải là một con trỏ-to-mảng.

Bạn cũng có thể đơn giản hóa việc định nghĩa hàm với một typedef:

typedef int intarray_t[4]; 

intarray_t* fn() { ... } 
+0

hmm, điều này không hoạt động trên bất kỳ trình biên dịch trực tuyến nào – Will

+0

@Will: Nó hoạt động với gcc v3.4.3 và v4.4.1, cũng như với Sun cc v5.9, vì vậy tôi muốn nói rằng đó là vấn đề với trình biên dịch trực tuyến. – sth

+0

Bạn có thể sử dụng typedef để giảm bớt các vấn đề cú pháp. Nhưng thực sự, bạn tốt hơn là quay trở lại int **, hoặc thậm chí int *. – Arkadiy

1

Bạn có thể trở int**

+0

Hoặc void *. Cả hai đều có nhiều thông tin về kích thước của mảng. –

2

Its not allowed to return arrays from functions, but there are workarounds.

Ví dụ, đoạn mã sau:

int fn()[4] { 
    ... 

Không được chấp nhận bởi trình biên dịch trực tuyến khác nhau; Tôi đã thử nó trên trình biên dịch trực tuyến Comeau, được coi là một trong những hầu hết tiêu chuẩn sau đây của trình biên dịch, và ngay cả trong chế độ thư giãn nó nói:

error: function returning array is not allowed

Một poster gợi ý trở int** ; điều này sẽ làm việc, nhưng phải rất cẩn thận khi bạn trả về bộ nhớ được cấp phát heap và không phân bổ stack.

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