2012-01-06 55 views
8

Tôi đang làm điều tương tự trong cả hai mã.Sự khác biệt giữa mảng ký tự và con trỏ

Trong mã 1: Tôi đã sử dụng char * và phân bổ không gian bằng cách sử dụng malloc trong main.

Trong mã 2: Tôi đã sử dụng một mảng char cho cùng một mục đích. Nhưng tại sao đầu ra lại khác?

Mã 1:

struct node2 
{ 
    int data; 
    char p[10]; 
}a,b; 

main() 
{ 
    a.data = 1; 

    strcpy(a.p,"stack"); 
    b = a; 
    printf("%d %s\n",b.data,b.p);  // output 1 stack 
    strcpy(b.p,"overflow"); 
    printf("%d %s\n",b.data,b.p);  // output 1 overflow 
    printf("%d %s\n",a.data,a.p);  // output 1 stack 
} 

Mã 2:

struct node1 
{ 
    int data; 
    char *p; 
}a,b; 

main() 
{ 
    a.data = 1; 
    a.p = malloc(100); 
    strcpy(a.p,"stack"); 
    b = a; 
    printf("%d %s\n",b.data,b.p); //output 1 stack 
    strcpy(b.p,"overflow"); 
    printf("%d %s\n",b.data,b.p); // output 1 overflow 
    printf("%d %s\n",a.data,a.p); // output 1 overflow(why not same as previous one?) 
} 
+1

@birryree 'b.p' được sao chép từ' a.p'. – Chad

+0

@Chad - Vâng tôi đã bỏ lỡ dòng 'b = a', vì vậy tôi đã xóa nhận xét của mình. – birryree

+0

@Chad-bản sao nông này là gì? –

Trả lời

10

Trong ví dụ thứ hai bạn đang gán a-b, có nghĩa là a.p (char*) đang được giao cho b.p. Do đó việc sửa đổi bộ nhớ được trỏ đến bởi b.p cũng đang sửa đổi bộ nhớ được trỏ đến bởi a.p, kể từ cả hai đều trỏ đến cùng một vị trí trong bộ nhớ.

Trong ví dụ đầu tiên, bạn có hai mảng riêng biệt. Chỉ định a đến bbản sao mỗi char trong mảng a.p đến b.p - những khối bộ nhớ này là một phần của struct, chúng không trỏ đến một phần cụ thể trong bộ nhớ. Bất kỳ sửa đổi nào đối với b.p trong trường hợp này không thể ảnh hưởng đến a.p vì chúng hoàn toàn không liên quan.

3

Con trỏ ký tự và mảng ký tự không giống nhau.

Nút của bạn với mảng đang được sao chép, vì vậy nội dung được sao chép vào nút mới. Khi bạn đặt giá trị mới (tràn) vào nút sao chép (b), nó chỉ ghi đè lên bản sao.

Nút của bạn với con trỏ ký tự nhận được giá trị của con trỏ được sao chép, vì vậy cả hai nút trỏ đến cùng một vị trí bộ nhớ. Khi bạn đặt giá trị mới (tràn) vào nút sao chép (b), nó ghi vào bộ nhớ mà cả hai nút đều có con trỏ.

3

Trong mã đầu tiên của bạn, cấu trúc chứa một mảng ký tự thực tế (char[10]), vì vậy khi bạn sao chép cấu trúc (b = a) mảng cũng được sao chép. Sau đó, bạn ghi đè lên một trong số họ nhưng không ghi đè một trong số họ.

Trong mã thứ hai của bạn, cấu trúc chứa một con trỏ đến một ký tự, vì vậy khi bạn sao chép cấu trúc con trỏ được sao chép, nhưng dữ liệu thì không. Vì vậy, cả hai đều trỏ đến cùng một dữ liệu.

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