массив трехмерных символов в C - PullRequest
0 голосов
/ 14 февраля 2011

Я хочу объявить трехмерный массив строк, где каждая строка имеет две строки.

Здесь я могу объявить это:

char *szArray[][2] = {
    {"string1", "string2"},
    {"string3", "string4"},
    {"string5", "string6"},
    {0, 0}
};

Я хочу сделать то же самоено количество строк распределяется динамически.

Здесь можно предположить, что 1-е измерение определяется динамически.2-е измерение - 2, 3-е - 25.

Испытано во многих отношениях безуспешно: (.

Заранее спасибо!

Ответы [ 4 ]

2 голосов
/ 14 февраля 2011

Первое, что у вас есть в вашем вопросе, это не 3-мерный массив char, а 2-мерный массив указателей на char. В C указатели и массивы - это не одно и то же.

Чтобы ответить на ваш вопрос, самый простой способ в современном C, C99, это использовать массивы переменной длины, VLA, для ваших целей. Для 3-мерного массива вы бы сделали

char szData[x][y][z];

, где x, y и z - это переменные или выражения, которые определяются только во время выполнения, когда вы нажмете это объявление.

Неудобство VLA заключается в том, что вы должны быть осторожны, чтобы они не становились слишком большими для вашего стека, и что вы должны инициализировать их, присваивая отдельным записям (здесь вложенный for -loop) .

Чтобы остаться с вашим примером 2-го массива строк

char* szData[x][y];

и тогда вам нужно будет назначить либо отдельные строки для каждого из указателей, либо установить для них 0.

for (size_t i = 0; i < x; ++i)
   for (size_t j = 0; j < y; ++j)
     szData[i][j] = 0;
1 голос
/ 28 октября 2011
int n = 0 ;

printf("Enter the number of rows\n");

scanf("%d",&n);

char *** szData = (char *** )malloc(n * sizeof(char ** )) ;

//Allocate memroy for each row

for(int i = 0 ; i < n ; i++ )
{ 
    szData[i] = (char ** ) malloc(2 * sizeof(char * )) ;
    for ( int j = 0 ; j < 2 ; j++ )
    { 
        szData[i][j] = (char *) malloc (25 * sizeof(char));
    }
 }

 //Assign some data

 for( int i = 0 ; i < n ; i++ )
 { 
    sprintf(szData[i][0],"string%d", i); 
    sprintf(szData[i][1],"string1%d", i);
 }

 //print all the elements

 for( int i = 0 ; i < n ; i++ ) 
 { 
    printf("%s\n",szData[i][0]);
    printf("%s\n",szData[i][1]);
 } 

 //free memory here
 for(int i = 0 ; i < n ; i++ )
 {  
    for ( int j = 0 ; j < 2 ; j++ )
    { 
        delete szData[i][j];
    } 
 }

 for(int i = 0 ; i < n ; i++ )
 {  
    delete szData[i];
 }

 delete szData;
0 голосов
/ 14 февраля 2011

Хорошо, здесь нет компилятора для двойной проверки, но вы можете сделать это несколькими способами. Самое простое было бы объявить Vector типа char [25] [3] и позволить c ++ сделать это за вас. Что-то вроде Vector foo, а затем просто отодвиньте ваши динамические элементы. Однако без компилятора я не уверен на 100%, что это сработает, так как в отношении многомерных массивов существуют забавные правила. Вы всегда можете измерить размер массива в качестве первого прохода, просто чтобы заставить его работать - что-то вроде Vector и начать добавлять, когда захотите. Вы также можете использовать вектор vector из char и иметь неровные массивы символов, где и 3 измерения могут быть динамическими, и это, вероятно, будет даже более эффективным с точки зрения памяти. Здесь много вариантов.

0 голосов
/ 14 февраля 2011

Я не получил никакой ошибки:

#include <stdio.h>

int main(){
char *szArray[][2] = { {"string1", "string2"}, {"string3", "string4"}, {"string5", "string6"}, {0, 0} };

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

}

Вот вывод:

$ gcc test.c
$ ./a.exe
string1
string5

Но вы не можете напечатать szArray [3] [0] [0], потому что это 0, если вы хотите инициализировать значение чем угодно, вы можете установить «\ 0» вместо 0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...