Как мне выделить 3d массив указателей на символы? - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть 3-й массив указателей на символы: 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[][]. Так как мне разумно использовать malloc для трехмерного массива или есть лучший способ сделать то, что я пытаюсь сделать?

Ответы [ 3 ]

1 голос
/ 13 апреля 2019

Вам не нужен трехмерный массив указателей символов, но нужен двумерный массив указателей символов.

С Лучший способ выделить память для двумерного массива в C? ,Вы можете выделить 2d массив символьных указателей, как показано ниже.

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

ИЛИ

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);

0 голосов
/ 13 апреля 2019
#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;
}

Итак, я написал некоторый код, проверил его, и он, кажется, работает .. Я не уверен, что это то, что вы ищете

0 голосов
/ 13 апреля 2019

Вот то, что я использовал для 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...