我正在尝试理解这段代码的作用(如果它甚至允许的话):
int * A;
int * B;
A = (int *)malloc( size_t somenumber );
B = A;
// bunch of stuff using B, B++, etc.
我读过的所有内容总是使用引用运算符(&
)或derefernce运算符(*
)将事物等同于指针。
这种等同做了什么?
而且,当我最终free(A)
B
会发生什么?
答案 0 :(得分:7)
这不等于两个指针,它是一个指针赋值。一旦
B = A;
执行,两个指针都指向同一个内存区域:访问*B
与访问*A
完全相同,B[i]
等同于A[i]
,所以上。
请注意,释放A
会使B
悬空,反之亦然。换句话说,在致电后
free(A);
访问*B
会成为未定义的行为。
答案 1 :(得分:6)
指针混淆时,图片总是很好:
int * A; // create a pointer to an int named "A"
int * B; // create a pointer to an int named "B"
A = (int *)malloc( size_t somenumber ); // Allocate A some memory, now B is an
// uninitialized pointer; A is initialized,
// but just to uninitialized memory
概念:
B = A; // Assign B to the value of A (The uninitialized memory)
free(A);
所以我认为你可以看到发生了什么。 B被赋予A的值,该值是已分配和未初始化的内存块。所以现在你只有两个指向同一区域的指针。
关于free()
问题,正如您在调用free(A);
时所看到的那样,A和B都指向同一区域时,您的程序就没有任何分配。这就是为什么在调用free()
时最好将指针设置为NULL
。
现在回到你最初的问题。如果你想检查两个指针是==
:
int * A; // create a pointer to an int named "A"
int * B; // create a pointer to an int named "B"
A = (int *)malloc( size_t somenumber ); // Allocate A some memory, now B is an
// uninitialized pointer; A is initialized,
// but just to uninitialized memory
if(B == A){
// The pointers are pointing to the same thing!
}
if(*B == *A){
// The values these pointers are pointing to is the same!
}
<强>更新强>
因此,要回答您更新的问题,我们需要更改B
的定义。
int *A; // A is a pointer to an int
int **B; // B is a pointer to a pointer to an int
B = &A; // B is now pointing to A
这样说明:
B=*A
:
int *A;
int B;
A = malloc(sizeof(int));
*A = 5;
B = *A;
这是对A
的尊重。所以你只需要拿A指向的任何东西并将其分配给B
,在这种情况下为5
答案 2 :(得分:2)
这不是“等同”,无论这意味着什么,这只是分配。指针A
的值(刚刚分配的内存块的地址)被复制到指针B
中。
当你free(A)
时,B
变成了所谓的“悬空指针”,即一个不再有效的指针。
答案 3 :(得分:2)
你只是将一个指针分配给另一个指针。现在B
将指向A
指向的任何内容。如果您免费A
,它也会免费B
(不知道如何对此进行说明,因为只发生了一个free
。至于你可能意味着的&
:
int *A;
int B;
A = &B;
表示指针A
指向整数B
,或将B
的地址存储在A
。
答案 4 :(得分:2)
这只是将两个指针设置为指向相同的内存地址。
如果其中一个稍后被更改为指向另一个地址,这不会影响另一个 - 虽然取消引用和更改指向的值当然也可以从另一个指针中看到。
如果其中一个指针被释放,则另一个副本将立即取消引用(假设它在赋值后保持相同的值)。
编写此类代码的一个实际原因可能是A
应该在分配的内存开始时保持“固定”,而B
将在程序执行期间在分配的范围内漫游。你需要A
来释放内存(也许作为基线),但出于某种原因使用另一个“临时”指针进入内存会更方便。
答案 5 :(得分:2)
在上面的情况中,当你free(A)
时,指针A指向的内存块(指针B也指向同一个块)将被释放并且资源返回给系统。存储在A或B中的地址仍然存在(我们称之为悬空指针 - 指向某个存储块的先前位置的指针)。通常,我们在调用free()
之后将其设置为NULL,至少对于现代操作系统将导致系统在我们稍后尝试错误地引用指针时发出SIGSEGV和核心转储的信号。否则,当指针指向的同一地址以某种方式再次分配给您时,程序可能会显示奇怪的行为(有时会崩溃,有时会继续,错误输出)。