[英]Difference between character array and pointer
我在兩個代碼中做同樣的事情。
在代碼1中:我使用了char *
並在main
使用malloc
分配空間。
在代碼2中:我使用了char
數組用於相同的目的。 但為什么輸出會有所不同?
代碼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
}
代碼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?)
}
在第二個示例中,您將a
分配給b
,這意味着將ap
( char*
)分配給bp
。 因此,修改bp
指向的內存也會修改ap
指向的內存,因為它們都指向內存中的相同位置 。
在第一個示例中,您有兩個單獨的數組 。 分配a
到b
將數組ap
中的每個char
復制到bp
- 這些內存塊是struct
一部分,它們不是指向內存中特定部分的指針。 在這種情況下對bp
任何修改都不會影響ap
因為它們完全不相關。
字符指針和字符數組不是一回事。
您的陣列節點正在被復制,因此內容將被復制到新節點中。 將新值(溢出)放入復制的節點(b)時,它只會覆蓋副本。
帶有字符指針的節點正在復制指針的值,因此兩個節點都指向相同的內存位置。 當您將新值(溢出)放入復制的節點(b)時,它會將兩個節點都指向的內存寫入內存。
在你的第一個代碼中,struct包含一個實際的字符數組( char[10]
),因此當你復制struct( b = a
)時,數組也會被復制。 然后你覆蓋其中一個而不是另一個。
在第二個代碼中,struct包含一個指向字符的指針,因此在復制struct時,指針會被復制,但數據卻不會復制。 所以兩者都指向相同的數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.