在C中分配一个3D char数组(char***)



我想分配一个字符***。我有一句话是这样的:"这是一个我需要拆分的命令。"我需要在每个盒子里放一个完整的句子,就像这样:

cmd[0] = "This is a command"
cmd[1] = "wich I"
cmd[2] = "need to"
cmd[3] = "split"

句子由类似&&, ||, ;, |的标记分隔
我的问题是我不知道如何分配我的三维数组。我总是有分段错误。

这就是我所做的:

for(k = 0; k < 1024; k++)
   for( j = 0; j < 1024; j++)
       cmd[k][j] = malloc(1024);

但几行之后,在另一个循环中:

»           cmd[k][l] = array[i];

我这里有个segfault。

我该怎么做?提前感谢

请记住,C中的2/3D数组与char ***不同。

如果你只想有一个1024^3个字符的数组,那么你会很好地使用

char array[1024][1024][1024];

但请记住,这将在堆栈上分配1GB的空间,这可能会起作用,也可能不会起作用。

要在堆上分配这么多,您需要正确键入:

char (*array)[1024][1024] = malloc(1024*1024*1024);

在这种情况下,array是指向2D 1024x1024字符矩阵阵列的指针。

如果你真的想使用char ***(如果你的数组长度是静态的,我不建议使用),那么你也需要分配所有的中间数组:

char *** cmd = malloc(sizeof(char **) * 1024);
for(k = 0; k < 1024; k++) {
    cmd[k] = malloc(sizeof(char *) * 1024);
    for( j = 0; j < 1024; j++)
           cmd[k][j] = malloc(1024);
}

如果要用比单个字符更长的分隔符来分割字符串,那么这就是字符串搜索的方法。

以下函数将接受一个输入字符串和一个分隔符字符串。它将返回一个必须是freed的char **,并且它将销毁您的输入字符串(重用它的内存来存储令牌)。

char ** split_string(char * input, const char * delim) {
    size_t num_tokens = 0;
    size_t token_memory = 16; // initialize memory initially for 16 tokens
    char ** tokens = malloc(token_memory * sizeof(char *));
    char * found;
    while ((found = strstr(input, delim))) { // while a delimiter is found
        if (input != found) { // if the strind does not start with a delimiter
            if (num_tokens == token_memory) { // increase the memory array if it is too small
                void * tmp = realloc(tokens, (token_memory *= 2) * sizeof(char *));
                if (!tmp) {
                    perror("realloc"); // out of memory
                }
                tokens = tmp;
            }
            tokens[num_tokens++] = input;
            *found = '';
        }
        // trim off the processed part of the string
        input = found + strlen(delim);
    }
    void * tmp = realloc(tokens, (num_tokens +1) * sizeof(char *));
    if (!tmp) {
        perror("realloc"); // something weird happened
    }
    tokens = tmp;
    // this is so that you can count the amount of tokens you got back
    tokens[num_tokens] = NULL;
    return tokens;
}

您将需要递归地运行此操作,以便通过多个分隔符进行拆分。

相关内容

  • 没有找到相关文章