Объявление массива указателей символов (передача аргументов) - PullRequest
4 голосов
/ 05 мая 2010

На этот вопрос должно быть легко ответить, но мне труднее найти конкретный правильный ответ в Google или в K & R. Я тоже мог бы не замечать этого, и если да, то, пожалуйста, поправьте меня!

Соответствующий код ниже:

int main(){
    char tokens[100][100];
    char *str = "This is my string";
    tokenize(str, tokens);
    for(int i = 0; i < 100; i++){
        printf("%s is a token\n", tokens[i]);
    }
}
void tokenize(char *str, char tokens[][]){
    int i,j; //and other such declarations
    //do stuff with string and tokens, putting
    //chars into the token array like so:
    tokens[i][j] = <A CHAR>
}

Итак, я понимаю, что у меня не может быть char tokens[][] в моей функции токенизации, но если я вместо нее введу char **tokens, я получу предупреждение компилятора. Кроме того, когда я пытаюсь поместить char в массив символов с tokens[i][j] = <A CHAR>, я segfault.

Куда я иду не так? (И сколько способов ... и как я могу это исправить?)

Большое спасибо!

Ответы [ 2 ]

5 голосов
/ 05 мая 2010

Вам необходимо указать размер второго измерения массива:

#define SIZE 100
void tokenize(char *str, char tokens[][SIZE]);

Таким образом, компилятор знает, что когда вы говорите tokens[2][5], ему нужно сделать что-то вроде:

  1. Найти адрес tokens
  2. Переместить 2 * SIZE байт после начала
  3. Переместить еще 5 байтов за , что адрес
  4. ???
  5. Прибыль!

Как оно есть, без указания второго измерения, если бы вы сказали tokens[2][5] как он узнал бы, куда идти?

3 голосов
/ 05 мая 2010

Ты рядом. Массивы и указатели - это не одно и то же, хотя иногда кажется, что это так. Вы можете сделать свой двумерный массив из указателей:

 char **tokens = malloc(100 * sizeof(char *));
 for (i = 0; i < 100; i++)
     tokens[i] = malloc(100);

А затем используйте:

void tokenize(char *str, char **tokens)

или вы можете указать размер массива в вашей функции tokenize():

void tokenize(char *str, char tokens[][100])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...