将字符串转换为2d数组时,第一个元素损坏

时间:2019-01-31 01:39:30

标签: c malloc heap-corruption

将给定的字符串转换为2D数组时,每次尝试返回时,数组的第一个元素都会更改为随机字符串。

这是代码。我已经GDBed并尝试使用无键字符串,但仍然失败。 count_letterscount_words只是循环遍历给定的指针,直到它们分别找到一个键或计算所有键。

char **str_to_dp(char const *str, char const key)
{
    char **arr = malloc(sizeof(*arr) * (count_words(str, key) + 1));
    int i = 0;

    if (!arr)
        perror("get_PATH");
    for (int j = 0, word = 0; str[j]; j++, i++, word = 0) {
        while (str[j] == key)
            j++;
        arr[i] = malloc(count_letters(str + j, key) * sizeof(char));
        if (!arr[i])
            perror("get_PATH");
        while (str[j] != key)
            arr[i][word++] = str[j++];
    }
    arr[i] = 0;
    return arr;
}

在循环内打印arr[i]时,以及仍在循环内进行GDB编码时,第一个元素保持为OK。每当我尝试打印时(例如,在返回之前使用循环),我都会为第一行(如果字符串具有足够的元素,则有时为第二行)获得随机值。知道为什么吗?

感谢您通读。

2 个答案:

答案 0 :(得分:0)

尝试在gdb中单步执行。基本的问题是,每当到达for循环str[j] == key的底部时,它都是正确的。除非键为'\0',否则测试str[j]将始终成功,并且for循环将从数组末尾移出。

您需要计算for循环中的单词数,而不是运行到str[j] == 0为止,或者在for循环结束时更改while循环以测试while (str[j] != key && str[j])

答案 1 :(得分:0)

除了@dgnuff所说的以外,似乎我的问题不在函数之外。我已经将(char **)数组强制转换为(char const *)而不是(char const **)