2015-09-27 3 views
1

Я пытаюсь создать таблицу строк с 20 строками и 20 столбцами. Он имеет следующие функции.Передача 2D-массива указателей строкового массива для работы в C

  • значения Вставить в клетки в таблице

  • Объединить 2 строки и заменить на другую строку

  • значения Modify в таблице

и еще несколько операций

Для этого я пытаюсь объявить, передать и изменить y 2d строки, т.е. 2D-массив из char указателей. Это то, что я сделал. Ниже код содержит только небольшую часть моего кода.

char *first_array[20][20]; //declared 2d array of pointers for storing a table of strings 



int modify(char *array1[], char *array2[]) //here i want to pass 2 rows row 1 and row 2 

{ 

int result1 = strcmp(array1[1], "~"); // here i want to access row 1 1st column for string operation 

int result2 = strcmp(array2[1], "$"); 

return result1+result2; 
} 


int main() { 

char *string = "hello"; 

strcpy(first_array[1][0], string); // insert values into table 

strcpy(first_array[1][1], "~"); 

strcpy(first_array[2][0], string); 

strcpy(first_array[2][1], "~"); 

printf("the result is %d\n", modify(first_array[1], first_array[2]); // pass row1 and row2 

return 0; 

} 

Правильный ли этот код? Поскольку Первоначально я получаю ошибку

expected ‘char **’ but argument is of type ‘const char **’

Но я как-то исправил и теперь я получаю ошибку сегментации. Я не могу получить ожидаемый результат.

Просьба предоставить мне правильный код для объявления, доступа, изменения и передачи функций 2d массива указателей/строк символов в C для вышеуказанных сценариев.

+0

Вы должны либо выделить память для 'first_array' перед использованием' strcpy', используя 'malloc', либо просто назначить вместо' strcpy'. Обратите внимание, что вы не должны изменять строку, если вы назначаете. И не забудьте включить 'stdlib.h' и' free' выделенную память, если вы собираетесь на 'malloc'. –

+0

@CoolGuy .... Благодарим вас за помощь. Я отредактировал мой вопрос. Ищем ваши ответы. – nithesh1990

+0

Я отбросил ваше редактирование, так как это сделало ответы бессмысленными. Если у вас есть другой вопрос, задайте другой вопрос. –

ответ

1

Вы должны выделить память first_array с использованием malloc, а затем выполнить требуемую операцию.

Как это -

first_array=malloc(sizeof(char *)*2);  // here used 2 as you need 2 pointer right now 
for(int i=1;i<3;i++){ 
     for(int j=0;j<2;j++){ 
      first_array[i][j]=malloc(strlen(string)+1); 
     } 
    } 

Примечание- Но помните, free выделенной памяти. А также не объявляйте его глобальным, если не нужно.

0

С вашей первой декларацией char *first_array[20][20] вы создаете глобальный 2d-массив и выделяете для него память той части памяти, в которой хранятся глобальные переменные.

Итак, у вас есть массив указателей, но были ли они указателями? Затем вам нужно выделить память для своих строк и передать указателям в вашем массиве адрес в строку.

Вы не можете использовать strcpy(), потому что ваш указатель не указывает на что-либо еще, он может содержать значение мусора, и, таким образом, создает segfault, пытающийся получить доступ к адресу памяти, который не существует или используется.

Смежные вопросы