5

为什么我不能在函数中分配一个点。正如您在以下代码中注意到的那样。函数返回后,我无法分配指向正确地址的指针 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
4

3 回答 3

5

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;
}
于 2013-02-07T20:30:22.763 回答
1

您是p1按值传递的,因此它不会在main函数中更新。但是,您是通过p2引用传递(注意您写的是&p2),因此可以更改它。

于 2013-02-07T20:30:04.447 回答
1

您按值传递 p1 ,因此更改仅在该函数的范围内可见。传递一个指向该指针的指针,就像你对 p2 所做的那样,你很好。

#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;
}
于 2013-02-07T20:29:24.983 回答