字符数组和指针的区别

8

我将在以下两个代码中执行同样的操作。

在代码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?)  
}

1
@birryree b.p 是从 a.p 进行浅拷贝。 - Chad
@Chad - 是的,我错过了b = a这一行,所以我删除了我的评论。 - wkl
@Chad - 这个浅复制是什么? - Anil Arya
@Arya,看一下这个问题及其答案:https://dev59.com/r3VC5IYBdhLWcg3wykUt - Chad
3个回答

10
在第二个例子中,你将a赋值给b,这意味着将a.pchar*)赋值给了b.p。因此修改由b.p指向的内存也会修改由a.p指向的内存,因为它们都指向内存中的同一位置。
在第一个例子中,你有两个独立的数组。将a赋值给b 复制了数组a.p中的每个charb.p - 这些内存块是struct的一部分,它们不是指向内存中特定部分的指针。在这种情况下,对b.p的任何修改都不会影响a.p,因为它们完全没有关联。

3
字符指针和字符数组不是同一种东西。
如果您使用数组的节点被复制,那么其内容就会被复制到新节点中。当您将新值(overflow)放入复制的节点(b)中时,它只会覆盖副本。
如果您使用字符指针的节点,它将复制指针的值,因此两个节点都指向同一个内存位置。当您将新值(overflow)放入复制的节点(b)中时,它会写入两个节点都指向的内存。

3
在你的第一段代码中,结构体包含一个实际的字符数组(char[10]),因此当你复制结构体(b = a)时,数组也被复制了。然后你只覆盖了其中一个数组而没有覆盖另一个。
在你的第二段代码中,结构体包含一个指向字符的指针,因此当你复制结构体时,指针被复制了,但数据并没有被复制。所以两个指针都指向同一份数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接