2011-02-14 6 views
0

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

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

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

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

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

Пробовал разными способами, не повезло :(

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

+0

Какой код вы пробовали до сих пор, чтобы получить динамическое распределение на работу? –

+0

C и C++ - это не тот же язык. – Cascabel

+0

Вы изменили весь тенор вопроса с помощью своего редактирования . Я предположил, что он хотел, чтобы это или было решение. –

ответ

1
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

я не получил какую-либо ошибку:.!

#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 

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

0

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

2

Первое, что у вас есть в вашем вопросе, - это не 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; 
Смежные вопросы