Как создать двумерный массив строк переменного размера, передав переменную - PullRequest
0 голосов
/ 18 января 2019

Может ли кто-нибудь дать мне пример того, как создать массив двумерных символов в Си, передав переменную для длины массива.

//Current program
int i;
int seq_cnt;    
exec sql    
        select count(0)     
        into seq_cnt     
        from    table;    
char tmp1[50][5+1];       
char tmp2[50][5+1];   

for(i=0;i < seq_cnt ; i++){   
     strcpy(tmp1[i],"something");    
     strcpy(tmp2[i],"something");    
}     

Теперь, что мне нужно, это размер массива tmp1 и tmp2, я хочу использовать seq_cnt, чтобы объявить фактический размер tmp1 и tmp2 вместо его жесткого кодирования (50).

нравится:

char tmp1[seq_cnt][5+1];     
char tmp2[seq_cnt][5+1];     

Я новичок в C.

1 Ответ

0 голосов
/ 18 января 2019

Я хочу использовать seq_cnt для объявления фактического размера tmp1

У

char (*tmp1)[5+1] = malloc(seq_cnt * sizeof *tmp1);

Обновленная информация о трех различных применениях звездочки * в C.

  1. Типы / определения переменных

    Здесь

    char (*tmp1)[5+1]
    

    звездочка используется для определения указателя, указателя на массив char[5+1].

    Обратите внимание, что круглые скобки являются обязательными, поскольку char *tmp[5+1] определит массив из 6 указателей на char.

  2. Оператор косвенного обращения (или разыменования)

    Здесь

    sizeof *tmp1
    

    звездочка используется, чтобы указать компилятору не принимать размер tmp1, который будет размером с указатель, а размер, на который указывает tmp1, а именно char[5+1].

    В качестве альтернативы можно написать sizeof (char[5+1]). Обратите внимание, что скобки не относятся к sizeof, так как это не функция, а оператор.

  3. Оператор умножения

    Здесь

    seq_cnt * sizeof ...
    

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

Таким образом, в общем случае верхний оператор выделяет seg_cnt раз байтов, необходимых char[5+1], и назначает адрес 1-го байта фрагмента, выделенного для tmp1, что указывает на достаточное количество памяти для хранения seq_cnt массив char[5+1].

...