2013-11-20 98 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);