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

C++ 字符数组和指针之间的差异,c++,c,arrays,pointers,struct,C++,C,Arrays,Pointers,Struct,我在两个代码中都做了同样的事情 在代码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); // o

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

在代码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
,这意味着
a.p
char*
)将被分配给
b.p
。因此,修改
b.p
指向的内存也就是修改
a.p
指向的内存,因为它们都指向内存中的同一位置


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

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

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


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

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


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

@birryrree
b.p
是从
a.p
@Chad浅拷贝的-是的,我错过了
b=a
行,所以我删除了我的评论。@Chad-这是什么浅拷贝?@Arya,看这个问题及其答案: