C-访问Dynamic 2D数组元素的segfault



我的目标是创建一个函数,该函数将字符串转换为由定界符分配初始字符串而产生的"单词"数组。所有单词都应终止终止。例如: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] != '')
    {
        j = 0;
        while (s[i] != c)
        {
            arr[k][j] = s[i];
            if (s[i + 1] == c || s[i + 1] == '')
            {
                j++;
                arr[k][j] = '';
                k++;
            }
            i++;
            j++;
        }
        j = 0;
        while (s[i] == c)
            i++;
    }
    arr[k] = 0;
    return (arr);
}

它仅与空字符串和其他所有内容一起使用。我相信问题在这里。

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

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

您的代码有许多问题,但最重要的是动态分配。您的代码不会分配存储器来保存一系列字符串(也就是char数组的数组)。

这一行:

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

分配内存以保存数字字符(即strlen(s) + 2字符),但这不是您想要的。尤其不是当arr是指向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;

没有segfaults 。(是原因,ij在分配的范围内)。

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

,则循环需要结束。

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

您还要分配更多的字节,而不是必要的,您可以具有相同大小的输入字符串的缓冲区,当找到分隔符或空的null时,您在所需尺寸的数组中分配一个新行,然后复制缓冲区。

最新更新