为什么我不能通过传入指针来创建整数?

时间:2014-04-07 11:47:48

标签: c pointers

似乎微不足道,但我无法理解为什么这不起作用。

int main(void){
    int *k = NULL;
    foo(k);
    printf("%p\n", k);
    printf("%d\n", *k);
    return 0;
}

void foo(int *i){
    i = malloc(sizeof(int));
    if (i == NULL){
        printf("memory fail\n");
    }else {
        *i = 10;
    }
}

输出:

(nil)
Segmentation fault (core dumped)

我猜这是因为我传入NULL而不是k的地址,但不确定如何传递k的地址。

1 个答案:

答案 0 :(得分:7)

您正在按值传递指针。因此指针的分配值不会返回给调用者。改为使用双重间接。例如,

void foo(int **i){
    *i = (int *) malloc(sizeof(int));
    if (*i == NULL){
        printf("memory fail\n");
    }else {
        **i = 10;
    }
}
int main(void){
    int *k = NULL;
    foo(&k);
    printf("%p\n", k);
    printf("%d\n", *k);
    return 0;
}

这将使k的地址作为值传递,并且由于双重间接而得到k。