2011-12-01 43 views
8

Tôi có mã bên dưới.C được phân bổ con trỏ? Đây là gì?

char a[] = "abcde"; 
char *b = "fghij"; 
char *c = malloc(6); 
char *d = c; 
c = "klmno"; 

Và các quốc gia tập thể dục:

Vẽ một bức tranh về cấu trúc dữ liệu a, b, c và d (với nội dung), nơi bạn có thể xem những gì đã được phân bổ và sử dụng mũi tên để hiển thị cách con trỏ được đặt.

giải pháp của tôi là:

 ____________ 
a -> |a|b|c|d|e|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
     ____________ 
b -> |f|g|h|i|j|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
     ____________ 
c -> |k|l|m|n|o|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
     ___________ 
d -> | | | | | | | 
     ¨¨¨¨¨¨¨¨¨¨¨ 

Tuy nhiên giải pháp của tôi không được chấp nhận và phản ứng là "phân bổ bộ nhớ cho một con trỏ đến b, c, d nhưng không phải là một". Ai đó có thể giải thích cho tôi điều này có nghĩa gì không?

+0

Không rõ câu hỏi của bạn là câu trả lời của bạn và điều gì đã xảy ra với nó. Hãy cố gắng nói lại nó để làm cho nó dễ hiểu hơn. – Neowizard

+2

@karlphillip, c không được lấp đầy, nó đã được gán lại. – Neowizard

+0

Không, nội dung của 'c' được ** không ** sao chép thành' d'. –

Trả lời

9

Đó là một phản ứng hơi khó hiểu, nhưng tôi đoán đơn khiếu nại là mảng a không điểm cho dữ liệu đó; nó chứa dữ liệu.

Vì vậy, đây có thể là những gì được yêu cầu (không có con trỏ mũi tên):

____________ 
a |a|b|c|d|e|\0| 
    ¨¨¨¨¨¨¨¨¨¨¨¨ 

Tên của một mảng có thể được sử dụng như một con trỏ, nhưng nó vẫn có một ý nghĩa tinh tế khác nhau.

+0

Vâng đó là những gì tôi nghĩ. Tuy nhiên không phải mảng cơ bản chỉ là một con trỏ đến phần tử đầu tiên? – Pithikos

+2

Tên của một mảng trỏ đến phần tử đầu tiên của mảng đó. Đó là một con trỏ theo nghĩa này. – karlphillip

+4

Có vẻ như họ muốn hình ảnh như [this] (http://c-faq.com/aryptr/aryptr2.html). –

7

tôi sẽ vẽ chúng như thế này:

 ____________ 
    |a|b|c|d|e|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
      a 
     ____________ 
b -> |f|g|h|i|j|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
     ____________ 
c -> |k|l|m|n|o|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
     _____________ 
d -> |g|a|r|b|a|g|e| 
     ¨¨¨¨¨¨¨¨¨¨¨¨¨ 

Thông báo như thế nào a dưới toàn bộ mảng, không bên cạnh một mũi tên. Điều này là để nhấn mạnh rằng a là toàn bộ mảng chứa chính chuỗi đó, không chỉ là một con trỏ. Điều này cho thấy bạn nhận ra sự khác biệt giữa một mảng và một con trỏ .

+0

Tôi sẽ không vẽ 'a' chính xác theo cách này. Nó __is__ một con trỏ –

+3

@Andrey: không, không phải. Có một sự khác biệt rõ rệt giữa một mảng và một con trỏ. Mặc dù các định danh mảng phân rã thành một con trỏ trong các ngữ cảnh nhất định, nhưng nó không làm cho chúng trở thành con trỏ. Hãy thử 'sizeof (a)' và 'sizeof (b)' và xem sự khác biệt cho chính bạn. –

+0

Vâng, bạn đã đúng vào thời điểm này. Nhưng thực sự nó không thực sự quan trọng ở đây, tôi nghĩ vậy. –

1

Nội dung của bộ nhớ trỏ bằng d không được xác định thực sự. Nó phải chứa một số rác có nguồn gốc từ malloc() trên c

1

Tôi thậm chí sẽ cố gắng phân biệt nơi dữ liệu được trỏ đến cuộc sống.

____________ 
a|a|b|c|d|e|\0| (in data segment or on stack) 
    ¨¨¨¨¨¨¨¨¨¨¨¨ 
    _____  ____________ 
b|ptr->| -> |f|g|h|i|j|\0| (in rodata) 
    ¨¨¨¨¨  ¨¨¨¨¨¨¨¨¨¨¨¨ 
    _____  ____________ 
c|ptr->| -> |k|l|m|n|o|\0| (in rodata) 
    ¨¨¨¨¨  ¨¨¨¨¨¨¨¨¨¨¨¨ 
    _____  ___________ 
d|ptr->| -> |X|X|X|X|X|X| (on heap) 
    ¨¨¨¨¨  ¨¨¨¨¨¨¨¨¨¨¨ 
1

Tôi nghĩ rằng bạn là khá nhiều ngay:

char a[] = "abcde"; 
    printf("a[]: [%s] length:%d\n", a, strlen(a)); 

    char* b = "fghij"; 
    printf("*b: [%s] length:%d\n", b, strlen(b)); 

    char* c = (char*)malloc(6); 
    char* d = c; 

    c = "klmno"; 
    printf("*d = c: d is [%s] length:%d\n", d, strlen(d)); 
    printf("*d = c: c is [%s] length:%d\n", c, strlen(c)); 

Đầu ra:

a[]: [abcde] length:5 
*b: [fghij] length:5 
*d = c: d is [] length:0 
*d = c: c is [klmno] length:5 

Lưu ý: Mặc dù strlen() tìm kiếm nhân vật NULL để có thể lặp trên một chuỗi các chuỗi và đếm các ký tự, ocurrence của NULL chính nó không được thêm vào tổng số cuối cùng, đó là lý do tại sao nó báo cáo 5 ký tự thay vì 6.

Đối với câu trả lời của bạn không được chấp nhận, có thể có một số hình thức khác mà giáo viên của bạn mong đợi bạn làm cho mảng a, bạn có thể muốn nói chuyện với đồng nghiệp của mình về nó, nhưng tôi không nghĩ là công bằng cho biết rằng bạn đã trả lời sai.

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