2015-05-26 13 views
5

Tôi có một khối lộn xộn mã nhưC có cách viết tắt của khởi tạo một cấu trúc với malloc và thiết lập các trường của nó không?

result = (node*)malloc(sizeof(node)); 
result->fx = (char*)malloc(sizeof(char) * 2); 
result->fx[0]='x'; result->fx[1]='\0'; 
result->gx = NULL; result->op = NULL; result->hx = NULL; 

nơi tôi khởi tạo một phần tử của kiểu

typedef struct node 
{ 
    char * fx; // function 
    struct node * gx; // left-hand side 
    char * op; // operator 
    struct node * hx; // right-hand side 
} node; 

Có cách viết tắt để làm điều đó? Nói cách khác, có cách nào để làm như tôi sẽ làm trong C + +?

result = new node { new char [] {'x','\0'}, NULL, NULL, NULL }; 
+1

Rất tiếc là không. Nếu bạn muốn khởi tạo tất cả các trường bằng 0, bạn có thể sử dụng 'calloc'. Và đừng in ra kết quả của 'malloc'. –

+1

Nếu 'fx' luôn là malloc'd với cùng kích thước thì bạn có thể làm cho nó thành mảng –

+1

Bạn có thể làm rõ liệu' 'x'' có bị mã hóa cứng hay nếu đây là mã giả và bạn muốn khởi tạo ' fx' với dữ liệu được người dùng nhập vào chẳng hạn? –

Trả lời

7

Bạn có thể viết chức năng bao bọc của riêng bạn:

static node *getNewNode(char *fx) { 
    node *p = calloc(1, sizeof *p); 
    if(p && fx) { 
    p->fx = malloc(strlen(fx) + 1); 
    if(!p->fx) { 
     free(p); 
     p = null; 
    } else { 
     strcpy(p->fx, fx); 
    } 
    } 
    return p; 
} 

Sau đó bạn có thể gọi đây là:

node *result = getNewNode("x"); 
if(result) ... 

Đó là dễ đọc hơn và ít cluttery.

5

Bạn không thể có hai mallocs lồng nhau và khởi tạo mọi thứ trong một lần. Tuy nhiên tôi sẽ đề nghị thiết kế sau:

typedef struct node 
{ 
    char fx[2], op[2]; // first byte being null indicates not-present 
    struct node *gx, *hx; 
} node; 

và sau đó bạn có thể đơn giản hơn viết:

node *result = malloc(sizeof *result); 

if (!result) 
    errorhandling...... 

// C89 
node temp = { "x" }; 
*result = temp; 

// C99 
*result = (node){ .fx = "x" }; 

Ví dụ C99 sử dụng literals hợp chấtinitializers định mà là trong C nhưng không phải C++ . Để thảo luận thêm, xem How to initialize a struct in ANSI C.

Bạn không phải sử dụng trình khởi tạo được chỉ định nhưng nó làm giảm khả năng xảy ra lỗi. Bất kỳ thành viên cấu trúc nào không được khởi tạo rõ ràng sẽ được khởi tạo như thể bằng 0.

Trong cả hai trường hợp, đối tượng tạm thời lý thuyết sẽ được tối ưu hóa, vì vậy giải pháp này không nên được coi là không hiệu quả chút nào.

+0

Có thể đáng nói rằng '" x "' là một chuỗi chữ và do đó giá trị cuối cùng của 'kết quả-> fx' trỏ đến sẽ không thể sửa đổi được. Đây là một hạn chế đối với cách tiếp cận của OP. – alk

+1

Điều này có nghĩa là bạn sẽ tạo thêm một đối tượng tạm thời trên ngăn xếp. Một giải pháp tốt hơn có lẽ là tạo ra một 'nút const tĩnh' với mọi thứ đã có sẵn. – Lundin

+0

@Lundin Tôi đã biên soạn với '-O1' và không có đối tượng tạm thời nào được tạo trên ngăn xếp. Lệnh assembly 'movq' được sử dụng để đặt' 'x'' trực tiếp trong không gian malloc'd. Bạn có thể hiển thị mã cho đề xuất của mình không? (lưu ý rằng OP có thể dự định '" x "' là một giá trị thu được khi chạy) –

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