代码之家  ›  专栏  ›  技术社区  ›  roufamatic RichardJohnn

C新手马洛克问题

  •  2
  • roufamatic RichardJohnn  · 技术社区  · 16 年前

    为什么不印 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 回复  |  直到 16 年前
        1
  •  5
  •   Yann Ramin    16 年前

    你的指针( 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
    }
    
        2
  •  0
  •   KFro    16 年前

    据我所见,有两个错误: 2) 如果要打印main中指针的值,则需要取消引用它,*value。

        3
  •  0
  •   kriss    16 年前

    在调用writevalue之前调用malloc,而不是在它内部(这样您就可以获得释放它的额外好处)。

    你的程序不打印5,但也有一个内存泄漏丢失地址分配的集团。

    int * value 是一份 int*值 总的来说。你可以把它看作函数的局部变量。您只能访问它所指向的位置。修改函数中的值时,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);
    }