簡體   English   中英

字符數組和指針之間的區別

[英]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 ,這意味着將apchar* )分配給bp 因此,修改bp指向的內存也會修改ap指向的內存,因為它們都指向內存中的相同位置

在第一個示例中,您有兩個單獨的數組 分配ab將數組ap中的每個char復制bp - 這些內存塊是struct一部分,它們不是指向內存中特定部分的指針。 在這種情況下對bp任何修改都不會影響ap因為它們完全不相關。

字符指針和字符數組不是一回事。

您的陣列節點正在被復制,因此內容將被復制到新節點中。 將新值(溢出)放入復制的節點(b)時,它只會覆蓋副本。

帶有字符指針的節點正在復制指針的值,因此兩個節點都指向相同的內存位置。 當您將新值(溢出)放入復制的節點(b)時,它會將兩個節點都指向的內存寫入內存。

在你的第一個代碼中,struct包含一個實際的字符數組( char[10] ),因此當你復制struct( b = a )時,數組也會被復制。 然后你覆蓋其中一個而不是另一個。

在第二個代碼中,struct包含一個指向字符的指針,因此在復制struct時,指針會被復制,但數據卻不會復制。 所以兩者都指向相同的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM