C++ 字符数组和指针之间的差异
我在两个代码中都做了同样的事情 在代码1中:我使用了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
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
)时,也会复制该数组。然后覆盖其中一个,但不覆盖另一个
在第二段代码中,结构包含一个指向字符的指针,因此当您复制结构时,会复制指针,但不会复制数据。所以两者都指向相同的数据。@birryrreeb.p
是从a.p
@Chad浅拷贝的-是的,我错过了b=a
行,所以我删除了我的评论。@Chad-这是什么浅拷贝?@Arya,看这个问题及其答案: