2011-07-06 36 views
5

Đi qua K & RI quá nhìn vào đoạn mã sau:C Array/Pointer vấn đề

#define ALLOCSIZE 1000 
static char allocbuf[MAXLINE]; 
static char *allocp = allocbuf 

char *alloc(int n){ 
     if (allocbuf+ALLOCSIZE-allocp>=n){ 
       allocp+=n; 
       return allocp-n; 
     } 
     else { ... } 

Tôi sợ câu hỏi của tôi rất đơn giản, nhưng tôi không thể có được vòng đầu của tôi là "nếu " hàng. Giá trị của allocbuf là bao nhiêu? Nó là một mảng char, phải không? Tôi nhìn lại những thứ trong cuốn sách, nhưng nó không giúp được gì. allocp ban đầu trỏ đến phần tử zeroth của mảng, phải không?

+0

ALLOCSIZE là gì? cũng lưu ý rằng allocbuf là một hằng số (địa chỉ của mảng) nên nó không thể lấy bất kỳ giá trị nào khác. – deStrangis

+0

Tôi nghĩ rằng có điều gì đó bị thiếu trong mã –

+0

Xin lỗi, tôi đã viết sai dòng #define ... chỉnh sửa –

Trả lời

2

allocbuf là một loại kiểu char [], nhưng trong nhiều ngữ cảnh, định danh tự phân tách thành con trỏ thuộc loại char *, giữ địa chỉ bắt đầu của mảng. Lưu ý rằng điều này không có nghĩa là allocbuf là một con trỏ, nó vẫn là một mảng.

Vì vậy, điều kiện của câu lệnh if thực hiện một số số học con trỏ.

+0

Nhưng không nên Nếu tuyên bố là: if (pntr + ALLOCSIZE-allocp> = n), trong đó char * pntr = & allocbuf? –

+0

Bạn hoàn toàn đúng về điều này, đây là cách chính xác về nguyên tắc. Nó chỉ là C xảy ra để có một cú pháp phím tắt mà kết quả trong 'allocbuf' là giống như' & allocbuf' trong bối cảnh này. –

+0

Cảm ơn bạn. Ngoài ra, "bối cảnh" khác, chúng ta có thể làm điều này trong? Bất kỳ phép toán số học nào cũng sẽ được trình biên dịch ngụ ý có nghĩa là con trỏ tới mảng đó? –

0

Hãy suy nghĩ về allocbuf là con trỏ đến đầu RAM của bạn, nói 0. Sau đó allocbuf + ALLOCSIZE sẽ trỏ đến cuối RAM của bạn. allocp đang trỏ đến phần cuối của vùng được cấp phát, một nơi nào đó ở giữa RAM của bạn. Vì vậy, allocbuf + ALLOCSIZE-allocp sẽ cung cấp cho bạn kích thước bộ nhớ miễn phí. Câu lệnh if sẽ kiểm tra nếu kích thước phân bổ được yêu cầu của bạn (n) nhỏ hơn bộ nhớ trống có sẵn.

+0

Tôi hiểu số học. Cuốn sách có một bức tranh đẹp để giúp giải thích nó. Đó là việc sử dụng tên mảng làm con trỏ tới mảng. Tôi không thể có được đầu của tôi xung quanh nó. –

0

allocbuf là một mảng tĩnh, thực ra nó trỏ đến phần tử đầu tiên của bộ ký tự tiếp giáp (mảng). allocp là một con trỏ khác tới mảng tiếp giáp và bạn có thể thay đổi giá trị của nó để trỏ đến các phần tử mảng.

+0

* allocbuf là một mảng tĩnh, thực sự nó trỏ đến phần tử đầu tiên * - một mảng không trỏ tới bất kỳ thứ gì, nó chỉ là phân định định danh cho một con trỏ. –

+0

Thankyou. Vấn đề tôi có là trong câu đầu tiên của bạn. "allocbuf là một mảng tĩnh ... nó trỏ đến ...". Nếu nó không phải là một con trỏ như thế nào nó có thể điểm? –

1

Trong khi chúng được khai báo theo các cách khác nhau, phân bổ và cấp phát là cả mảng char (char *) và phân bổ các điểm có hiệu quả trên char đầu tiên của bộ đệm sau khi khởi tạo và sau khi vượt qua "if" body, cùng địa chỉ + số byte được phân bổ, và con số này tăng lên với mỗi chu kỳ mới trong cơ thể "nếu". Tóm lại, nó trỏ vào char miễn phí đầu tiên trong bộ đệm. Dòng "if" bạn đang mắc kẹt nhằm mục đích xác minh xem có đủ chỗ để phân bổ ký tự n trong allocbuf, bộ đệm tĩnh hay không. Dòng này có thể được discomposed như sau:

char* static_buffer_beginning = allocbuf; 
char* static_buffer_ending = static_buffer_beginning + MAXLINE; 
int nb_chars_still_available = static_buffer_ending - allocp; 
if (nb_chars_still_available >= n) { 

Tôi chỉ là một chút nhầm lẫn bởi "ALLOCSIZE" xuất hiện trong mã của bạn: giá trị của mình là gì, nơi nào nó đến từ ?! Tôi cho rằng đó là lỗi đánh máy hoặc điều gì đó tương tự và giá trị của nó bằng MAXLINE, nhưng muốn chắc chắn không trả lời sai cho bạn.

+0

Bỏ qua MAXLINE. Tôi không có ý định gõ nó vào, khi tôi có nghĩa là ALLOCBUF. Tôi đã chỉnh sửa câu hỏi. –

+0

OK. Sau đó, thay thế MAXLINE bằng ALLOCSIZE hoặc macro bạn sử dụng và lời giải thích vẫn giữ nguyên. – psycho

+0

Hmmm, khá mới với stackOverflow, vì vậy tôi không biết cách nhận xét câu trả lời không phải từ tôi, nhưng tôi hoàn toàn không đồng ý với nhận xét đầu tiên của bạn về câu trả lời @Blagovest Buyukliev. 'char * pntr = allocbuf;' là OK, nhưng 'char * pntr = & allocbuf;' là sai, gcc sẽ sinh ra các kiểu con trỏ không tương thích. – psycho