【问题标题】:Difference between character array and pointer字符数组和指针的区别
【发布时间】:2012-02-04 14:30:42
【问题描述】:

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

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

【问题讨论】:

  • @birryree b.p 是从a.p 浅拷贝的。
  • @Chad - 是的,我错过了b = a 行,所以我删除了我的评论。
  • @Chad - 这是什么浅拷贝?
  • @Arya,查看此问题及其答案:stackoverflow.com/questions/184710/…

标签: c++ c arrays pointers struct


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2010-12-20
        • 1970-01-01
        • 2011-09-22
        • 1970-01-01
        • 2015-08-19
        • 1970-01-01
        • 2016-02-03
        • 1970-01-01
        • 2013-12-16
        相关资源
        最近更新 更多