C中的两个指针指向同一个结构 - 从一个指针更改结构

时间:2014-10-01 19:21:03

标签: c pointers

我试图理解一些代码的逻辑并使用指针。

因此,例如,如果声明了结构的两个指针(比如A和B)并且它们彼此相等, 然后结构中的数据通过其中一个指针改变,它是在第二个指针中改变还是只是重写?我想我的问题是:A和B字面上指向同一个东西还是指向另一个的副本?

代码执行如下操作:

 somestruct *A;
 somestruct *B;
 B = A;
 A->data = 5;
 B->data = 6; 

5 个答案:

答案 0 :(得分:3)

在上面的例子中,他们会指出同样的事情。

然而,在使用之前和之后分配和释放内存也很重要,否则您将获得意外行为和/或分段错误。

somestruct *A;
somestruct *B;

A = malloc(sizeof(somestruct));

B = A;
A->data = 5;
B->data = 6; 

printf("Data in A: %d", A->data); /* Prints 6 */
printf("Data in B: %d", B->data); /* Also Prints 6 */

...

free(A);

检查malloc的结果并确保操作成功也是一种很好的做法。如果您想要更改A指向的位置,并且还想要更改B指向的位置,这种情况可能会成为一个问题。除非您更改两者,否则更改一个指针位置将不会更新另一个。这是双指针将被使用的地方。 EG

somestruct *A;
somestruct **B;

A = malloc(sizeof(somestruct));
B = &A; // Get the address of A

A->member = 5;
printf("Member: %d", (*B)->member); /* Prints 5 */

free(A);
A = malloc(sifeof(somestruct));
A->member = 10;
printf("Member: %d", (*B)->member); /* Prints 10 */

请注意,在双指针示例中,B不需要再次更新。

请参阅此处的示例:Double Pointer

答案 1 :(得分:2)

  • 将A和B字面指向相同的东西,还是指向另一个的副本?

A和B将字面指向相同的东西

答案 2 :(得分:2)

假设你做了类似这样的事情

 somestruct *A;
 somestruct *B;
 A = malloc( sizeof(somestruct)) // addded this statement to show that memory allocation is done for A only
 B = A;
 A->data = 5;
 B->data = 6; 

这意味着现在指针B指向A指向的相同内存位置,因此无论你改变什么(通过使用A或B)都会改变指针数据,因为它本质上是相同的数据。现在只是指向2个指针(即A和B)。

答案 3 :(得分:1)

您正在更改指针,而不是指针引用的对象。也就是说,它是使用其中一个指针进行更改的对象。

例如

#include <stdio.h>

int main()
{
    struct A { int i; } a = { 0 };

    struct A *p1 = &a;
    struct A *p2 = &a;

    p1->i = 10;

    printf( "%d\n", p2->i );
} 

答案 4 :(得分:0)

指针不是结构,而只是一个内存地址(以及关于内存布局的编译器指令),因此当您通过指针操作时,您可以更改内存。给定另一个指针指向同一块内存,它指向更改的结构。

当然,如果你做这样的事情:

long *a = malloc(sizeof long);
long *b = a;

然后再说:

b = malloc(sizeof long);

然后a不会更改,但b是。