C变量未初始化

xzabzqsa  于 2023-03-28  发布在  其他
关注(0)|答案(3)|浏览(199)

在调试下面的代码片段时,我观察到function = copy_string(temp_function);没有初始化变量函数(仍然指向0x0),即使在return copy上从copy_string()复制指向包含正确结果的初始化内存地址。

static char* copy_string(char* string)
{
    char* copy = NULL;
    uint32_t length = 0U;

    length = strlen(string);
    copy = malloc(sizeof(char) * (length +1));
    strcpy(copy, string);

    return copy;
}

static void separate_test(const char* test_name, char* function, char* scenario, char* expected_result)
{
    const char* delimiter = "__";
    char* new_test_name = NULL;
    char* temp_function = NULL;
    char* temp_scenario = NULL;
    char* temp_expected_result = NULL;
    uint32_t length = strlen(test_name);

    new_test_name = malloc(sizeof(char) * (length +1));
    strcpy(new_test_name, test_name);
    temp_function = strtok(new_test_name, delimiter);
    function = copy_string(temp_function);
    temp_scenario = strtok(NULL, delimiter);
    scenario = copy_string(temp_scenario);
    temp_expected_result = strtok(NULL, delimiter);
    expected_result = copy_string(temp_expected_result);
}

使用以下参数调用该函数:

const char* test_name = "function_name__scenario__expected_result";
char* function = NULL;
char* scenario = NULL;
char* expected_result = NULL;

separate_test(test_name, function, scenario, expected_result);

这种行为的原因是什么?
编辑:固定分配问题。

3htmauhk

3htmauhk1#

您需要为null终止符保留空间。这一行:

copy = malloc(sizeof(char) * length);

应为:

copy = malloc(length + 1);

sizeof(char)总是1,所以这里不需要它。
另外,回想一下,C中的参数是通过值传递的,所以你对separate_test()中的test_namefunction等所做的更改不会被调用者看到。你可能想把指针传递给指针,如下所示:

const char* test_name = "function_name__scenario__expected_result";
char* function = NULL;
char* scenario = NULL;
char* expected_result = NULL;

separate_test(test_name, &function, &scenario, &expected_result);

separate_test()变为:

static void separate_test(const char* test_name, char** function, char** scenario, char** expected_result)
{
    const char* delimiter = "__";
    char* new_test_name = NULL;
    char* temp_function = NULL;
    char* temp_scenario = NULL;
    char* temp_expected_result = NULL;
    uint32_t length = strlen(test_name);

    new_test_name = malloc(length+1);
    strcpy(new_test_name, test_name);
    temp_function = strtok(new_test_name, delimiter);
    *function = copy_string(temp_function);
    temp_scenario = strtok(NULL, delimiter);
    *scenario = copy_string(temp_scenario);
    temp_expected_result = strtok(NULL, delimiter);
    *expected_result = copy_string(temp_expected_result);
}
hl0ma9xz

hl0ma9xz2#

您正在设置functionseparate_test中其他变量的值。然而,由于它们是通过值传递的,因此会更改调用函数中这些变量的值。

e5njpo68

e5njpo683#

这是因为seperate_test中的function参数是一个临时变量。所以它需要一个它指向的随机地址,因为在调用它之前变量被初始化为NULL。我建议做一个:function = malloc(sizeof(function))在调用函数或返回函数参数之前。

相关问题