C新手malloc问题

时间:2010-05-07 23:46:37

标签: c pointers function malloc

为什么不打印5

void writeValue(int* value) {
    value = malloc(sizeof(int));
    *value = 5;
}


int main(int argc, char * argv) {
    int* value = NULL;
    writeValue(value);
    printf("value = %d\n", *value); // error trying to access 0x00000000
}

我该如何修改它以便在仍然使用指针作为writeValue的参数时才能工作?

3 个答案:

答案 0 :(得分:5)

您的指针(int *value)是一个值。如果要保持上述行为,则需要指向指针的指针。

void writeValue(int** value) {
    *value = malloc(sizeof(int));
    **value = 5;
}


int main(int argc, char * argv) {
    int *value = NULL;
    writeValue(&value); // Address of the pointer value, creates int**
    printf("value = %d\n", *value); // prints 5
}

答案 1 :(得分:0)

从我看到的内容中有2个错误: 1)如果要更改指针的值,则需要将指针传递给指向函数int **值的指针。 2)如果要在main中打印指针的值,则需要对其进行解引,* value。

答案 2 :(得分:0)

在调用writevalue之前调用malloc,而不是在它内部(因此你可以获得额外的好处,以便能够释放它)。

您的程序不会打印5,但是通过丢失已分配的bloc的地址也会导致内存泄漏。

其他人解释的原因是参数int * value是main int * value的副本。您可以将其视为函数的局部变量。您只能访问它指向的位置。修改函数中的值时,main中的其他值不会更改。

void writeValue(int* value) {
    *value = 5;
}


int main(int argc, char * argv) {
    int* value = NULL;
    value = malloc(sizeof(int));
    writeValue(value);
    printf("value = %d\n", *value);
    free(value);
}