【问题标题】:Having trouble understanding the output of code when dealing with pointers in C在处理 C 中的指针时难以理解代码的输出
【发布时间】:2020-06-05 17:45:25
【问题描述】:

这是我的编码期末练习题。

#include <stdio.h>
#define N 3

// a structure type for storing an array. 
typedef struct
{
    int *ptrData;
    int length;
} ARRAY;

void printArray(ARRAY A)
{
    int i;
    printf("Array Content:\n");
    for (i=0; i<A.length; i++)
    {
        printf("%d\n", A.ptrData[i]);
    }
}

int main()
{
    int x[N]={1, 3, 5};
    ARRAY array1;
    ARRAY array2;
    array1.ptrData=x;
    array1.length=N;
    array2=array1;
    array1.ptrData[0]=10;
    printArray(array1);
    printArray(array2);
    return 0;
}

输出是

Array Content:
10
3
5
Array Content:
10
3
5

我无法理解为什么array2 的输出与array1 相同。我了解他们如何获得 array1 的值,但不确定 array2 的值,因为据我了解,array1 的第一个元素在声明 array1 = array2 后更改为 10,但从输出来看,它看起来像 @ 987654329@ 的第一个元素也设置为 10。

如果想澄清为什么array2 的输出与array1 相同。

【问题讨论】:

  • 因为它们指向同一个数组,其中只有一个。所以改变它,你通过哪个struct访问它并不重要。
  • 尝试在两个数组中打印ptrData 的值。你会明白的。
  • ...structs ;)
  • 因为当你复制结构体时,你不会“硬复制”内容,所以每个结构体的指针仍然指向同一个位置,并且两个结构体都没有“拥有”指向的数据。

标签: c arrays pointers output


【解决方案1】:

这是你的结构:

typedef struct {
    int *ptrData;
    int length;
} ARRAY;

在这里,您将结构的一个实例分配给另一个:

array2=array1;

这会复制所有字段,但字段ptrData 只是一个指向数字数组实例的指针。这也称为浅拷贝,因为它只创建结构本身的字段的副本,而不是它可能包含的引用对象的副本(与深拷贝相反,它不能用c 原语)。所以数字数组实例不会重复,只有指向它的指针。因此,数组只存在一次,无论您是通过结构实例array1 还是array2 访问它,都会反映出修改。

如果你有一个结构,情况会有所不同

typedef struct {
    int data[N];
    int length;
} ARRAY;

这里,确实存在数组内容data 的两个实例,并且数据将在分配时复制

【讨论】:

    【解决方案2】:

    因为array1和array2都指向同一个(x)

    您可以通过打印 x 的值来检查这一点

    for (i=0; i<N; i++)
    {
        printf("%d\n", x[i]);
    }
    

    这里 x[0] 的值也会改变

    【讨论】:

      【解决方案3】:
      typedef struct
      {
          int *ptrData;
          int length;
      } ARRAY;
      

      这里ptrData是一个指向内存地址的指针。

      array1.ptrData=x;
      

      这一行将array1结构的指针成员指向的内存设置为数组x的起始地址。数组的名称也是一个指针,因此这里的赋值可以没有任何错误。

      array2=array1;
      

      此行将array1 持有的所有信息复制到array2。这意味着array2.ptrData = array1.ptrDataarray2.length = array1.length。 然后array2.ptrData指针指向与array1.ptrData指针相同的内存。您可以使用这两个指针访问相同的内存地址。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 2011-10-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多