2010-05-14 32 views
6

phép nói rằng tôi có như sau:Việc khởi tạo con trỏ này có cần thiết không?

CHARLINK * _init_link(CHARLINK **link) 
{ 
    short i; 
    (*link)->cl = (CHARLINK **) calloc(NUM_CHARS, sizeof(CHARLINK *)); 
    for (i = 0; i < NUM_CHARS; i++) 
     (*link)->cl[i] = NULL; 
    return (*link); 
} 

là vòng lặp để khởi tạo mỗi phần tử để NULL cần thiết hoặc là họ tự động NULL từ calloc?

Trả lời

13

Có, việc gán cho NULL trong vòng lặp là cần thiết. calloc khởi tạo cho tất cả các bit 0. Nhưng một con trỏ null có thể không được biểu diễn như thế. Nó phụ thuộc vào việc triển khai thực hiện. Do đó việc phân công là cần thiết.

3

Không, calloc khởi tạo bộ đệm của nó thành 0.

+0

Cụ thể, nó khởi tạo thành "tất cả bit 0", có thể không phải là 'NULL' (hoặc 0 cho giá trị' float', cho vấn đề đó). –

7

Điều đó phụ thuộc một chút vào hệ thống của bạn, nhưng trong phần lớn các trường hợp thì không sao. calloc() trả về cho bạn một bộ đệm có các số không. Tuy nhiên, con trỏ null trên máy của bạn có thể không phải là một mẫu bit 0. Trên một máy mà con trỏ null không khác, bạn có thể sẽ gặp rắc rối.

+2

Dựa vào hành vi thường hoạt động nhưng không được đảm bảo để hoạt động là một ý tưởng tồi. Thậm chí nếu bạn không bao giờ chạy vào nó, nó sẽ không dễ dàng hơn để rời khỏi vòng lặp và chỉ cần thay đổi 'calloc()' thành 'malloc()', vì vậy không ai bị cám dỗ lấy ra vòng lặp và phá vỡ mã trên một trong những nền tảng kỳ lạ đó? –

+0

+1 @Chris, đó là những gì tôi muốn làm. –

+0

chính xác, chính xác – Mandrake

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