字符数组和指针之间的差异

Difference between character array and pointer

本文关键字:之间 指针 数组 字符      更新时间:2023-10-16

我在这两个代码中都做了同样的事情。

在代码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 %sn",b.data,b.p);     // output 1 stack
    strcpy(b.p,"overflow"); 
    printf("%d %sn",b.data,b.p);     // output  1 overflow
    printf("%d %sn",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 %sn",b.data,b.p);   //output 1 stack
    strcpy(b.p,"overflow");  
    printf("%d %sn",b.data,b.p);   // output 1 overflow
    printf("%d  %sn",a.data,a.p); // output 1 overflow(why not same as previous one?)  
}

在第二个示例中,将a分配给b,这意味着将a.pchar*)分配给b.p。因此,修改b.p指向的内存也就是修改a.p指向的内存,因为它们都指向内存中的同一位置

在第一个示例中,您有两个独立的数组。将a分配给b会将数组a.p中的每个char复制到b.p——这些内存块是struct的一部分,它们不是指向内存中特定部分的指针。在这种情况下,对b.p的任何修改都不会影响a.p,因为它们完全无关。

在您的第一个代码中,结构包含一个实际的字符数组(char[10]),因此当您复制结构(b = a)时,数组也会被复制。然后覆盖其中一个,但不覆盖另一个。

在第二个代码中,结构包含一个指向字符的指针,因此当您复制结构时,指针会被复制,但数据不会。所以两者都指向相同的数据。

字符指针和字符数组不是一回事。

带有数组的节点将被复制,因此内容将被复制到新节点中。当您将新值(溢出)放入复制的节点(b)时,它只会覆盖副本。

具有字符指针的节点正在复制指针的值,因此两个节点都指向相同的内存位置。当您将新值(溢出)放入复制的节点(b)中时,它会写入两个节点都有指针指向的内存。