所以这是我在头文件中的结构:
struct _Variable {
char *variableName;
char *arrayOfElements;
int32_t address;
};
typedef struct _Variable Variable;
这是我在 .c 文件中实现的 init 函数:
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
}
谁能告诉我如何修复我的实现?
最佳答案
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;
}
关于c - 为 C 结构编写 init 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20102551/