对动态二维数组的元素进行段错误

时间:2019-03-13 06:55:26

标签: c multidimensional-array malloc

我的目标是创建一个函数,该函数将字符串转换为由定界符分割初始字符串而得到的“单词”数组。所有单词都应以空值结尾。 例如:strtoarr(“ ** hello *** world *”,“ *”)应生成{“ hello”,“ world”}。这是我的功能。

char    **strtoarr(char const *s, char c)
{
    char    **arr;
    size_t  i;
    size_t  j;
    size_t  k;

    arr = malloc(sizeof(**arr) * (strlen(s) + 2));
    if (arr == 0)
        return (NULL);
    i = 0;
    k = 0;
    while (s[i] != '\0')
    {
        j = 0;
        while (s[i] != c)
        {
            arr[k][j] = s[i];
            if (s[i + 1] == c || s[i + 1] == '\0')
            {
                j++;
                arr[k][j] = '\0';
                k++;
            }
            i++;
            j++;
        }
        j = 0;
        while (s[i] == c)
            i++;
    }
    arr[k] = 0;
    return (arr);
}

它仅适用于空字符串和段错误。我相信问题就在这里。

arr[k][j] = s[i];

但是我不明白问题是什么。 预先感谢

2 个答案:

答案 0 :(得分:2)

您的代码有很多问题,但最重要的是动态分配。您的代码没有分配用于保存字符串数组(也就是char数组的数组)的内存。

此行:

arr = malloc(sizeof(**arr) * (strlen(s) + 2));

分配用于保存数字字符(即strlen(s) + 2字符)的内存,但这不是您想要的。尤其是当arr是指向char的指针时。

您可以使用的一种简单方法是分配一个char指针数组,然后为每个这些指针分配一个char数组。

这将是:

char** arr = malloc(sizeof(*arr) * NUMBER_OF_WORDS_IN_INPUT);

arr[0] = malloc(NUMBER_OF_CHARACTERS_IN_WORD0 + 1);
arr[1] = malloc(NUMBER_OF_CHARACTERS_IN_WORD1 + 1);
...
arr[NUMBER_OF_WORDS_IN_INPUT - 1] = malloc(NUMBER_OF_CHARACTERS_IN_LAST_WORD + 1);

然后您可以使用语法将字符存储到arr

arr[i][j] = SOME_CHARACTER;

无段错误。 (这是有原因的,要求ij在分配范围之内。)

答案 1 :(得分:0)

如果s[i]NULLwhile (s[i] != c && s[i] != '\0')

,则内部while循环需要结束

您在s[i + 1]语句中检查if,但继续循环。

另外,您分配的字节数超出了必要,您可能拥有与输入字符串相同大小的缓冲区,并且当找到定界符或NULL时,您将在数组中分配所需大小的新行并复制缓冲到里面。