如何分配3d的char指针数组?

时间:2019-04-13 07:07:02

标签: c arrays malloc

我有一个3d的char指针数组:char ***semicols。 我希望这些值与

相似
semicol[0][0] = "ls"
semicol[0][1] = "~"
semicol[1][0] = "man"
semicol[1][1] = "grep"

,依此类推。我有一个char **args数组,其中存储了这个数组,我也知道此数组中的分号数。我要创建具有上述结构的较小的char** ARGS,所以要创建semicol[0] = {"ls", "~"}。 但是我事先不知道每个分号参数的字符串数,因此无法将其设置为静态char *semicols[][]。那么如何合理地为3d数组进行malloc分配,或者有更好的方法来执行我要尝试的操作?

3 个答案:

答案 0 :(得分:1)

您不需要3D的字符指针数组,而需要2D的字符指针数组。

Best way to allocate memory to a two-dimensional array in C?中,您可以分配二维字符指针数组,如下所示。

char* (*semicol) [col] = malloc(sizeof(char* [row][col]));

OR

char* (*semicol) [col] = malloc(sizeof(*semicol) * row);  //avoids some size miscomputations, especially when the destination type is later changed. //Refer chqrlie's comment.

成功分配内存后,您可以执行semicol[i][j] = "text";

您可以通过调用free(semicol);

释放已分配的内存。

答案 1 :(得分:0)

这是我一次用于3D阵列的东西。

#include<stdio.h>
#include<stdlib.h>

int main(){
    int n = 3, m = 3;
    char ***a;

    // Malloc and store.
    a = (char***)malloc(sizeof(char**) * n);
    for(int i = 0; i <n; ++i){
        a[i] = (char**)malloc(sizeof(char*) * m);
        for(int j = 0; j < m; ++j){
            a[i][j] = "abc"; // <-- you can put your string here in place of "abc".
        }
    }

    // Print or process your array or whatever serves your purpose.
    for(int i = 0; i < n; ++i){
        for(int j = 0; j < m; ++j){
            printf("%s\n", a[i][j]);
        }
    }

    return 0;
}

答案 2 :(得分:-2)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv)
{
    char ***t = malloc(sizeof(char) * 1);           // one pointer
    int i, j;

    char s[1][3][2] = {{"he", "ll", 0}};

    printf("%s\n", s[0][0]);

    for( i = 0; i < 1; ++i )
    {
        t[i] = malloc(sizeof(char) * (argc - 1));       // not including program name
        for( j = 0; j < argc - 1; ++j )
        {
            t[i][j] = calloc(strlen(argv[j + 1]) + 1, sizeof(char));        // +1 for '\0'
        }
    }

    strncpy(t[0][0], argv[1], strlen(argv[1]));
    printf("%s\n", t[0][0]);

    return 0;
}

所以我写了一些代码,对其进行了测试,它似乎可以工作。.我不确定这是否是您要寻找的