2013-11-20 143 views
0

所以這是我在頭文件結構:寫作初始化函數

struct _Variable { 
    char *variableName; 
    char *arrayOfElements; 
    int32_t address; 
}; 
typedef struct _Variable Variable; 

這裏是我實施.c文件初始化功能:

void initVariable(Variable *variable, char *variableName, char *arrayOfElements, 
     int32_t address) { 
    int lengthOfVariableNameWithTerminatingChar = strlen(variableName) + 1; 
    variable->variableName = malloc(
      sizeof(char) * lengthOfVariableNameWithTerminatingChar); 
    strncpy(variable->variableName, variableName, 
      lengthOfVariableNameWithTerminatingChar); 

    int lengthOfArrayOfElementsWithTerminatingChar = strlen(arrayOfElements) 
      + 1; 
    variable->arrayOfElements = malloc(
      sizeof(char) * lengthOfArrayOfElementsWithTerminatingChar); 
    strncpy(variable->arrayOfElements, arrayOfElements, 
       lengthOfArrayOfElementsWithTerminatingChar); 

    variable->address = address; 
} 

我沒有得到任何錯誤,當我編譯,但當我運行我的測試文件:

void test_initVariable() { 
    printf("\n---------------test_initVariable()-----------------\n"); 
    // TODO: 
    Variable *variable1; 
    initVariable(variable1, "variable1", "1, 2, 3", 4); // <== Causes binary .exe file to not work 
} 

誰能告訴我如何解決我的實施?

+1

如果你覺得未初始化的指針指向?關於完全相同的問題已經有數十個問題。 – 2013-11-20 17:20:04

+0

「導致二進制文件不起作用」?你是否收到錯誤信息? – Floris

+0

創建一個變量並將變量的指針傳遞給初始化程序 – Floris

回答

6
Variable *variable1; 

給你一個未初始化的指針。你不擁有它指向的內存,所以不能安全地寫入它。

您需要爲variable1

Variable variable1; 
initVariable(&variable1, "variable1", "1, 2, 3", 4); 

將工作分配存儲空間。

如果你想variable1進行動態分配,它會是最簡單的辦法initVariable處理這個

Variable* initVariable(char *variableName, char *arrayOfElements, int32_t address) 
{ 
    Variable* var = malloc(sizeof(*var)); 
    if (var != NULL) { 
     var->variableName = strdup(variableName); 
     var->arrayOfElements = strdup(arrayOfElements); 
     var->address = address; 
    } 
    return var; 
} 

請注意,我還簡化了弦的分配/人口在這裏。您的代碼可以正常工作,但如果您使用兼容posix的系統,則strdup是實現相同結果的更簡單的方法。

正如評論中所述,如果Variable的字符串成員全部爲string literals,則不需要分配存儲空間。在這種情況下,您可以簡化爲

Variable* initVariable(char *variableName, char *arrayOfElements, int32_t address) 
{ 
    Variable* var = malloc(sizeof(*var)); 
    if (var != NULL) { 
     var->variableName = variableName; 
     var->arrayOfElements = arrayOfElements; 
     var->address = address; 
    } 
    return var; 
} 
+0

您是否必須爲字符串分配內存? –

+0

@BitFiddlingCodeMonkey是的。這已經由'initVariable' – simonc

+0

@BitFiddlingCodeMonkey處理,這取決於。在這個例子中,你沒有(字符串文字具有靜態存儲持續時間,並且他們已經爲它們分配了存儲空間)。 – 2013-11-20 17:22:41

0

您應該將&variable1傳遞給您的方法。運算符&將採用您的結構的地址,這就是您需要分配給variable上的指針的地址。

用途:

Variable var1; 

,然後調用方法:

initVariable(&var1, "variable1", "1, 2, 3", 4);