Почему я получаю ошибку BAD_ACCESS при попытке заполнить 2d-массив значениями в C? [Дубликат]

Не знаете, почему sed не работает, но вы можете использовать tr вместо

$ echo 'abcABC123' | tr -d 'A-Z'
abc123

Из man tr

tr - перевести или удалить символы

-d, --delete удалить символы в SET1, не переводить

29
задан user1362058 23 May 2013 в 22:40
поделиться

4 ответа

char ** не представляет собой 2D-массив - это будет массив указателей на указатели. Вам нужно изменить определение printarray, если вы хотите передать ему 2D-массив:

void printarray( char (*array)[50], int SIZE )

или эквивалентно:

void printarray( char array[][50], int SIZE )
22
ответ дан Carl Norum 31 August 2018 в 19:38
поделиться

В main () переменная «array» объявлена ​​как

char array[50][50];

Это 2500-байтовый фрагмент данных. Когда main () 's array' передается около, это указатель на начало этих данных. Это указатель на char, который, как ожидается, будет организован в строках из 50.

Однако в функции printarray () вы объявляете

 char **array

«array» здесь указатель на «указатель char».

@ Предложение Lucus «void printarray (char array [] [50], int SIZE)» работает, за исключением того, что не является общим в том, что ваш параметр SIZE must равно 50.

Идея: поражение (yeech) тип массива параметров в printarray ()

void printarray(void *array, int SIZE ){
    int i;
    int j;
    char *charArray = (char *) array;

    for( j = 0; j < SIZE; j++ ){
        for( i = 0; i < SIZE; i ++){
            printf( "%c ", charArray[j*SIZE + i] );
        }
        printf( "\n" );
    }
}

Более элегантным решением является создание массива "в main () массив указателей.

// Your original printarray()
void printarray(char **array, int SIZE ){
    int i;
    int j;
    for( j = 0; j < SIZE; j++ ){
        for( i = 0; i < SIZE; i ++){
            printf( "%c ", array[j][i] );
        }
        printf( "\n" );
    }
}

// main()
char **array;
int SIZE;
// Initialization of SIZE is not shown, but let's assume SIZE = 50;
// Allocate table
array = (char **) malloc(SIZE * sizeof(char*));
  // Note: alternative syntax
  // array = (char **) malloc(SIZE * sizeof(*array));
// Allocate rows
for (int row = 0; row<SIZE; row++) {
  // Note: sizeof(char) is 1. (@Carl Norum)
  // Shown here to help show difference between this malloc() and the above one.
  array[row] = (char *) malloc(SIZE * sizeof(char));
    // Note: alternative syntax
    // array[row] = (char *) malloc(SIZE * sizeof(**array));
  }
// Initialize each element.
for (int row = 0; row<SIZE; row++) {
  for (int col = 0; col<SIZE; col++) {
    array[row][col] = 'a';  // or whatever value you want
  }
}
// Print it
printarray(array, SIZE);
...
5
ответ дан chux 31 August 2018 в 19:38
поделиться

Вы можете легко передать 2d-массив, используя двойной указатель.

  void printarray( char **array, int n)
  {
     int i, j;
     for(i=0; i<n; i++ )
     {
         for(j=0; j<n; j++)
         {
            printf("%c ", array[i][j] );
         }
        printf( "\n" );
     }
  }

  int main()
  {
      int n = 2;
      int i, j;

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

      for (i=0; i<n; i++) 
      {
        array[i] = (char *) malloc(n* sizeof(char));
      }

     for (i=0; i<n; i++)
     {
       for (j=0; j<n; j++)
       {
           scanf("%c ", &array[i][j]);
       }
     }

     printarray(array, n);

     return 0;
  }

Полный код: Ideone

0
ответ дан rashedcs 31 August 2018 в 19:38
поделиться

Так как C99 поддерживает массивы с динамическим размером, следующий стиль просто более удобен для пропускания 2-мерного массива:

void printarray( void *array0, int SIZE ){
    char (*array)[SIZE] = array0;
    int i;
    int j;
    for( j = 0; j < SIZE; j++ ){
        for( i = 0; i < SIZE; i ++){
            printf( "%c ", array[j][i] );
        }
        printf( "\n" );
    }
}
0
ответ дан Simon Woo 31 August 2018 в 19:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: