2013-07-10 28 views
8

Giả sử đoạn mã sau:struct c, con trỏ và cấp phát bộ nhớ cho các lĩnh vực

struct c { 
    char* name; 
}; 

int main(int argc, char *argv[]) { 
    struct c c1; 
    c1.name = "Ana"; 
    printf ("%s\n",c1.name); 
    return 0; 
} 

phản ứng đầu tiên của tôi sẽ có được để nghĩ rằng tôi cần phải phân bổ một số không gian, hoặc trên heap, hoặc bằng một rõ ràng char name[] = "Anna" , nhưng ví dụ của tôi ở trên hoạt động. Trình biên dịch có lưu trữ chuỗi đó trong phân đoạn Dữ liệu và trỏ đến nó không? Nói cách khác, giống như việc thực hiện một số

struct c { 
    char* name = "Ana"; 
}; 

Cảm ơn.

Trả lời

8
struct c c1; 
c1.name = "Ana"; 

Bạn không cần phải cấp phát bộ nhớ ở đây vì bạn đang làm cho các điểm trỏ c1.name thành một chuỗi literals đen và chuỗi có thời gian lưu trữ tĩnh. Điều này là không tương tự như:

char name[] = "Anna"; 

Bởi vì trong trường hợp này bộ nhớ được phân bổ để lưu trữ các sting đen và sau đó là chuỗi chữ "Anna"sao chép vào mảng name. Những gì bạn làm với sự phân công struct c1.name = "Ana" cũng tương tự như khi bạn làm:

char *name = "Anna"; 

ví dụ đưa ra quan điểm con trỏ đến một chuỗi chữ.

+1

+1 để thực sự trả lời câu hỏi –

+2

Được rồi, tôi nghĩ mình đã hiểu. Điều gì làm rõ đây là "thời gian lưu trữ tĩnh" của bạn, điều đó có nghĩa là nó thực sự nằm trong phân đoạn dữ liệu tại thời gian biên dịch, và sau đó trình biên dịch biết rõ ràng là điểm nào. Cảm ơn. –

3

Tôi mới đến C nhưng từ những gì tôi nghĩ rằng đây có thể chỉ là giống như

char *cThing; 
cThing = "Things!"; 

nơi printf("%s\n", cThing); sau đó sẽ in "Những điều cần!", Ngoại trừ bạn đang khai báo con trỏ trong một cấu trúc.

+1

Tôi đang cho bạn một điểm chiến thắng :) Tôi thấy tuyệt vời khi bạn có trực giác, và sử dụng một ví dụ đơn giản tốt để truyền đạt nó. Làm tốt :) –

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