2017-12-27 304 views
0

我試圖從指針給出結構的函數中填充結構字段。當通過引用函數傳遞時分配結構和填充字段

使用malloc分配結構後,返回的指針非空,並且結構字段已經很好地初始化,但是在返回到main之後。我傳遞給函數的指針是null。

這裏一個簡單的例子

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

#define INFO(fmt, args...)  printf(fmt, ## args); 
#define ERROR(fmt, args...)  printf("In %s : " fmt, __func__, ## args); 

typedef enum 
{ 
    ERR_OK = 0, 
    ERR_KO = -1, 
    ERR_MALLOC_FAIL = -2, 

}error_t; 

typedef struct 
{ 
    unsigned int field; 
}test_struct; 

int struct_constructor(test_struct* myStruct, unsigned int field) 
{ 
    myStruct = malloc(sizeof(test_struct)); 

    if(NULL == myStruct) 
    { 
     ERROR("Error allocating memory for myStruct\n"); 
     return ERR_MALLOC_FAIL; 
    } 

    INFO("passed field = %d\n", field); 

    myStruct->field = field; 

    INFO("struct field = %d\n", myStruct->field); 

    return ERR_OK; 
} 

int main(void) 
{ 
    test_struct* myStruct = NULL; 

    struct_constructor(myStruct, 1); 

    if(myStruct == NULL) 
    { 
     INFO("NULL structure in main\n"); 
    } 
} 

這裏是輸出:

passed field = 1 
struct field = 1 
NULL structure in main 

我不明白爲什麼結構的指針不在函數內部空,爲空主。
另外我不想返回指針,因爲我使用返回碼來檢查函數中出現了什麼問題。

+1

你有一個指針的指針傳遞給在功能上作出影響調用代碼變化的功能。這是新手C代碼中非常常見的錯誤。這是一個很多重複的結局。 –

回答

3

那麼,因爲C是通過值,所以你所做的任何更改是本地指針變量。 main()與它無關。如果您返回該指針並將其分配給您想要更改的指針,則會起作用。

或傳遞它的地址並對原始變量進行更改。

struct_constructor(&myStruct, 1); 

而且

int struct_constructor(test_struct** myStruct, unsigned int field) 
{ 
    *myStruct = malloc(sizeof(test_struct)); 

    if(NULL == *myStruct) 
    { 
     ERROR("Error allocating memory for myStruct\n"); 
     return ERR_MALLOC_FAIL; 
    } 

    INFO("passed field = %d\n", field); 

    myStruct->field = field; 

    INFO("struct field = %d\n", (*myStruct)->field); 

    return ERR_OK; 
}