2013-08-01 46 views
8

Nếu bạn cần trả lại struct từ một hàm, bạn thường sẽ trả lại con trỏ tới số struct.trả về một mảng các cấu trúc hoặc một mảng các con trỏ struct?

Nếu sau đó bạn muốn trả về một mảng của cấu trúc, là nó khuyến khích để:

  1. trở lại một mảng của cấu kiện (con trỏ đến phần tử đầu tiên)
  2. hoặc trả lại một mảng các con trỏ struct?

tôi đã rút ra một sơ đồ cho hai tùy chọn dưới đây:

1:

enter image description here

2:

enter image description here

Với định nghĩa struct sau

struct values { 
    int a; 
    int b; 
}; 

đây là một số mẫu mã để truy cập vào các lĩnh vực của cấu trúc từ hai lựa chọn:

Lựa chọn # 1:

struct values *vals = get_values1(); 
printf("%d, %d\n", values[0].a, values[1].b); 

Lựa chọn # 2:

struct values **vals = get_values2(); 
printf("%d, %d\n", values[0]->a, values[1]->b); 
+0

nghi ngờ của bạn là gì? –

+0

@GrijeshChauhan điều gì là tốt nhất? Liệu nó có quan trọng không? – Tyilo

+2

Vấn đề duy nhất tôi thấy không sử dụng phiên bản 1, có thể dễ dàng xác định số lượng cấu trúc trong phiên bản thứ hai, vì con trỏ 'NULL' có thể được sử dụng làm phần tử stopper, trong khi phiên bản đầu tiên có thể không thể xác định giá trị nút này. – alk

Trả lời

6

Vấn đề duy nhất tôi thấy không sử dụng phiên bản 1, có thể dễ dàng xác định số lượng cấu trúc (được trả về) trong phiên bản thứ hai, vì con trỏ NULL có thể được sử dụng làm phần tử stopper. phiên bản đầu tiên có thể không xác định được phần tử stopper.

5

Trừ bạn có một lý do chính đáng để trả về một con trỏ tới con trỏ (ví dụ, nếu bạn muốn sửa đổi các con trỏ sau này), tôi nghĩ một con trỏ đến cấu trúc là đủ tốt. Không cần phải lừa xung quanh với con trỏ đôi.

0

Đối với tôi, khi số lượng người theo dõi tăng lên, độ phức tạp của mã tăng nhanh hơn. Vì vậy, tôi thích Tùy chọn của bạn # 1: struct values *foo().

Yêu cầu dữ liệu có nên tiến về phía # 2: struct values **foo(), đề xuất tạo loại mới typedef struct values *ValuesSet và trả về con trỏ về điều đó: ValuesSet *foo().

1

Ví dụ cho một cuốn sách mới bắt đầu trên C, câu hỏi rõ ràng sẽ được đáp ứng tốt hơn theo tùy chọn 1 (không có hướng dẫn) như đã được chỉ ra bởi các câu trả lời cho đến nay. Tuy nhiên, nếu có nhiều câu hỏi hơn (ví dụ: đó là cách tốt nhất để vượt qua các cấu trúc trong một khung lớn) thì tôi chắc chắn sẽ chọn tùy chọn 2. Tại sao? các cấu trúc là các đơn vị phức tạp của dữ liệu và có xu hướng trở thành các thực thể độc lập được phân bổ và truyền đi xung quanh và xử lý theo các cách khác nhau - tất cả mã xử lý chúng bằng truy cập trực tiếp sẽ cần viết lại nếu xử lý dữ liệu trở nên phức tạp hơn.

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