字符数组和指针之间的区别
我在两个代码中做同样的事情。
在代码1中:我使用了char *
并在main
使用malloc
分配空间。
在代码2中:我使用了char
数组用于相同的目的。 但为什么输出会有所不同?
代码1:
struct node2 { int data; char p[10]; }a,b; main() { a.data = 1; strcpy(ap,"stack"); b = a; printf("%d %s\n",b.data,bp); // output 1 stack strcpy(bp,"overflow"); printf("%d %s\n",b.data,bp); // output 1 overflow printf("%d %s\n",a.data,ap); // output 1 stack }
代码2:
struct node1 { int data; char *p; }a,b; main() { a.data = 1; ap = malloc(100); strcpy(ap,"stack"); b = a; printf("%d %s\n",b.data,bp); //output 1 stack strcpy(bp,"overflow"); printf("%d %s\n",b.data,bp); // output 1 overflow printf("%d %s\n",a.data,ap); // output 1 overflow(why not same as previous one?) }
在第二个示例中,您将a
分配给b
,这意味着将ap
( char*
)分配给bp
。 因此,修改bp
指向的内存也会修改ap
指向的内存,因为它们都指向内存中的相同位置 。
在第一个示例中,您有两个单独的数组 。 分配a
到b
将数组ap
中的每个char
复制到bp
– 这些内存块是struct
一部分,它们不是指向内存中特定部分的指针。 在这种情况下对bp
任何修改都不会影响ap
因为它们完全不相关。
在你的第一个代码中,struct包含一个实际的字符数组( char[10]
),因此当你复制struct( b = a
)时,数组也会被复制。 然后你覆盖其中一个而不是另一个。
在第二个代码中,struct包含一个指向字符的指针,因此在复制struct时,指针会被复制,但数据却不会复制。 所以两者都指向相同的数据。
字符指针和字符数组不是一回事。
您的arrays节点正在被复制,因此内容将被复制到新节点中。 将新值(溢出)放入复制的节点(b)时,它只会覆盖副本。
带有字符指针的节点正在复制指针的值,因此两个节点都指向相同的内存位置。 当您将新值(溢出)放入复制的节点(b)时,它会将两个节点都指向的内存写入内存。