2010-02-01 49 views
6

Tôi cần tạo cấu trúc bên trong một hàm (động với malloc) Sau đó, tôi cần để có thể gửi nó đến chính của tôi và sử dụng nó ở đó. Tôi không có vấn đề gì với việc tạo ra nó, tôi chỉ cần giúp đỡ để gửi nó đến chính của tôi, và tôi cũng không chắc chắn làm thế nào để truy cập nó một khi tôi nhận được nó ở đó.Cấu trúc trả về từ hàm (C)

struct retValue * fn() { 
struct retValue 
{ 
    int number; 
}; 

struct retValue* st = malloc(sizeof(*st)); 


return(???); 
} 

Đó là mã tôi có cho đến nay.

Cảm ơn bạn đã được trợ giúp. Hãy cho tôi biết nếu bạn cần một cái gì đó làm rõ.

EDIT:

Ok Cần làm rõ.

Điều tôi đang cố gắng đạt được, là khả năng chuyển cấu trúc thông qua chức năng đến chính của tôi. Bên trong hàm tôi phải khai báo biến và gán giá trị cho chúng. Sau đó, trong chính tôi phải in từng biến của cấu trúc vào màn hình. Không có biến toàn cục nào có thể được sử dụng (và do đó tôi không giả sử cấu trúc toàn cầu).

Hy vọng rằng làm rõ mọi thứ.

CHỈNH SỬA 2:

Tôi đã tìm ra vấn đề của mình. Đối với những người quan tâm, trước tiên tôi cần phải có cấu trúc nguyên mẫu bên ngoài các chức năng của mình. Sau đó, tôi có thể vượt qua st và sau đó truy cập nó đúng cách. Cảm ơn tất cả, và xin lỗi vì những từ ngữ nghèo nàn.

+0

Biến toàn cầu và cấu trúc toàn cầu khác nhau. Bằng cách làm cho cấu trúc def global, bạn chỉ định nghĩa một kiểu không phải là một biến. Nếu bạn không làm cho cấu trúc bị lỗi toàn cầu, các hàm khác sẽ không biết bất cứ điều gì về loại * mới này * và tệp prg của bạn sẽ không biên dịch. – codaddict

Trả lời

8
// make the structure def global so that main() and fun() know about it. 
struct retValue { 
int number; 
};  

// function fn returns a pointer to the structure retValue 
struct retValue * fn() {  

struct retValue* st = malloc(sizeof(*st)); 

// return the pointer to the newly allocated structure. 
return(st); 
} 

int main() { 

// call fn() to create a new structure dynamically. 
struct retValue *st = fn(); 
} 
0

chỉ: return st;

+0

Tôi nhận được 'trở về từ loại con trỏ không tương thích' – Blackbinary

4

Bạn sẽ nhận được hàng trăm câu trả lời cho câu hỏi này. :)

  1. Bạn có thể trả lại con trỏ trực tiếp. Ví dụ. return st, Chức năng chính của bạn sau đó sẽ có thể truy cập vào các thành viên của cấu trúc như trong st->number. Đảm bảo chính con trỏ của bạn khi hoàn tất.

  2. Đây không nhất thiết là mẫu thiết kế tuyệt vời. Callee của bạn (fn) đang cấp phát bộ nhớ, nhưng người gọi của bạn (chính) cần xử lý hậu quả. Bạn cũng có thể cấu trúc này với chính phân bổ bộ nhớ (sử dụng malloc hoặc trên stack trực tiếp) và đi qua trong con trỏ cho fn để sử dụng. Sau đó, malloc/miễn phí xảy ra ở cùng một vị trí. Nếu không, bạn muốn chắc chắn đặt tên cho hàm fn của bạn, chẳng hạn như allocateMyStructure vì vậy rõ ràng là lợi tức cần phải được giải phóng.

P.S. Tôi không chắc chắn về các quy tắc để xác định cấu trúc bên trong một hàm, nhưng bạn không nên làm điều đó ở đây. Khai báo struct retValue ở trên hàm main và fn của bạn, vì vậy chúng có thể vừa "nhìn thấy" kiểu khai báo.

+0

Tôi không nghĩ rằng đó là một vấn đề phân bổ bộ nhớ trong một chức năng, miễn là tên chức năng là rõ ràng về nó (một cái gì đó như CreateNewFoo() hoặc một cái gì đó). Nếu không, tôi đồng ý với bạn. –

0

Vui lòng khai báo cấu trúc trong một tệp tiêu đề chung và bao gồm nó trong tệp nguồn của bạn và sau đó trả về st từ hàm hiện tại của bạn. Cần làm việc.

0
struct retValue { int number; }; 

int main(...) { 
    struct retValue *myval; 

    myval = fn(); 
} 

struct retValue *fn() { 
    struct retValue* st = malloc(sizeof(*st)); 

    return st; 
} 
1

Một điều tôi muốn chỉ ra ... kể từ khi cấu trúc là địa phương để các chức năng, là có một cấu trúc toàn cầu phù hợp chính xác điều đó, nếu không bạn có thể chạy vào rắc rối, làm thế nào sẽ main() biết cái gì trong cấu trúc đó? Bạn có thể làm rõ?

Chỉnh sửa: Có vẻ như câu trả lời của tôi đã xác nhận những gì tôi nghĩ.

 
struct retValue 
{ 
    int number; 
}; 

int main(int argc, char **argv){ 
    struct retValue *ptr; 
    ptr = fn(); 
    /* do what you have to do... */ 
    .... 
    return 0; 
} 

struct retValue * fn() { 
    struct retValue* st = malloc(sizeof *st); 

    /* do you work on the structure */ 
    st->number = 5; 

    return st; 
} 

Ngẫu nhiên ai đó đã đăng this trước đó vào ngày hôm nay.

Hy vọng điều này sẽ giúp, Trân trọng, Tom.

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