gpt4 book ai didi

C函数中的指针赋值

转载 作者:太空狗 更新时间:2023-10-29 14:59:21 26 4
gpt4 key购买 nike

为什么我不能在函数中分配一个点。正如您在以下代码中注意到的那样。函数返回后,我无法将指针 p1 指向正确的地址。但是有了全局指针*p,我就可以存储地址信息了。

#include <stdio.h>
#include <stdlib.h>

int *p = NULL;
void test(int * pt1, int**pt2){
p = (int*)malloc(sizeof(int));
pt1 = p;
*pt2 = p;
printf("p points to %p\n", p);
printf("pt1 points to %p\n", pt1);
printf("pt2 points to %p\n", *pt2);
}

int main(void) {
int *p1 = NULL;
int *p2 = NULL;

printf("p points to %p\n", p);
printf("p1 points to %p\n", p1);
printf("p2 points to %p\n", p2);

test(p1, &p2);

printf("p points to %p\n", p);
printf("p1 points to %p\n", p1);
printf("p2 points to %p\n", p2);

return 0;
}

输出:

p points to (nil)
p1 points to (nil)
p2 points to (nil)
p points to 0x8acb008
pt1 points to 0x8acb008
pt2 points to 0x8acb008
p points to 0x8acb008
p1 points to (nil)
p2 points to 0x8acb008

最佳答案

test 中,变量 pt1 本身就是一个离散指针。也就是说,它不仅仅是 p1 的别名,而是一个只在调用的生命周期内存在的副本。

因此,您对其所做的任何分配都只会在该调用期间退出,而不会传播到调用之外。当您从 test 返回时,指针 pt1 不复存在,任何更改都不会被复制回来。

除了像使用 pt2 那样使用额外的指针“层”,有时还可以使用返回值与更广泛的受众“共享”更改:

#include <stdio.h>
#include <stdlib.h>

int *p = NULL;
int *test(int * pt1, int**pt2){
p = (int*)malloc(sizeof(int));
pt1 = p;
*pt2 = p;
printf("p points to %p\n", p);
printf("pt1 points to %p\n", pt1);
printf("pt2 points to %p\n", *pt2);
return pt1;
}

int main(void) {
int *p1 = NULL;
int *p2 = NULL;

printf("p points to %p\n", p);
printf("p1 points to %p\n", p1);
printf("p2 points to %p\n", p2);

p1=test(p1, &p2);

printf("p points to %p\n", p);
printf("p1 points to %p\n", p1);
printf("p2 points to %p\n", p2);

return 0;
}

关于C函数中的指针赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14760328/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com