Индексация двухмерного массива char

Подскажите пожалуйста, как правильно передать в функцию указатель на двухмерный массив char и как его индексировать? Спасибо.
4 ответа

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define ROWS 5
#define MAX_STR 256
 
void printRows(char **arr, size_t rows){
    size_t i;
    for ( i = 0; i < rows; ++i )
        printf("%s\n", arr[i]);
}
 
int main(void){
    char buf[MAX_STR], *p, **arr;
    int i;
    
    if ( ( arr = (char**)malloc(sizeof(char*) * ROWS) ) == NULL ){
        fprintf(stderr, "Memory error!\n");
        exit(1);
    }
    printf("Enter %d strings:\n", ROWS);
    for( i = 0; i < ROWS; ++i ){
        if ( !fgets(buf, MAX_STR, stdin) ){
            fprintf(stderr, "Can't get row");
            exit(1);
        }
        if ( p = strrchr(buf, '\n') )
            *p = '\0';
        if ( !*buf ){
            fprintf(stderr, "Empty rows not allowed!\n");
            exit(1);
        }
        if ( ( arr[i] = strdup(buf) ) == NULL ){
            fprintf(stderr, "Memory error!\n");
            exit(1);
        }
    }
    printf("You have entered:\n");
    printRows(arr, ROWS);
    
    for ( i = 0; i < ROWS; ++i )
        free(arr[i]);
    free(arr);
    
    exit(0);
}


Хороший вопрос. Есть 2 подхода. 1. (школярский)
#define N 20
#define M 35
fm(int A[N][M]....)
{
   for(i=0;i<n;i++)
     for(j=0; j<M j++) 
        if (A[i][j]==0) Oh!
}
main()
{
  int B[N][M];
  fm(B);
}
2й -изощренный
int **CreateM(int n, int m)
{  int **a;
     a = (int **)malloc(n * sizeof(int *));
     for(i=0; i<n; i++)
       a[i] = (int *) malloc(m*sizeof(int));
     return a;
}
fm(int **x, n, m)
{
   for(i=0;i<n;i++)   // абсолютно тоже самое! 
     for(j=0; j<M j++) 
        if (A[i][j]==0) Oh!
}
main()
{
  int **B;
  B = CreateM(n, m);
  fm(B, n, m);
}
2-й подход значительно гибче. Размерность массива ты можешь определить по ходу счета, часто она зависит от исходных данных Кроме того, при некоторой модификации он дает возможность делать строки разной длины.


Спасибо большое. Я всё пытался с одним указателем. Не думал, что тут нужен указатель на указатель.


ivpoed, вообще-то можно и с одним указателем. Делаем сами некоторую работу за транслятор, код чуть менее понятный, но покороче
int A[N*M];
 A[i*M+j] = ... // это то же, что и A[i][j] в предыдущих вариантах