2010-05-04 11 views
4

Это то, что должно быть легко ответить, но мне труднее найти правильный ответ на Google или в K & Р. Я мог бы полностью игнорировать это, тоже, и если да, то пожалуйста, настройте меня прямо!Объявление массива указателей символов (переход arg)

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

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 в свой массив char с tokens[i][j] = <A CHAR>, я segfault.

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

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

+0

@ Даниэль, это не поможет - у него есть двумерный массив, а не массив указателей. –

+0

@ Джон - да, я не был уверен, как еще это сказать :) У меня много функций в функции, но это не слишком важно для моего вопроса! – Isaac

ответ

5

Вы должны указать размер второго измерения массива:

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

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

  1. Найти адрес tokens
  2. Move 2 * SIZE байт мимо начала
  3. Move более 5 по tes прошло что Адрес
  4. ???
  5. Прибыль!

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

+0

Ха-ха, оцените окончательные примечания: я должен был быть более явным и осторожным там: у меня есть, я объявил, что у меня есть маркеры правильно написаны, а str - пример, который я изложил: теперь редактирую мой пост. Благодаря! – Isaac

+0

Когда вы говорите «РАЗМЕР», вы говорите, что я должен сказать, как долго будет второй массив (100 в моем примере) или сообщить функции, каков размер данных? (sizeof (char) в моем примере) – Isaac

+0

@ Исаак: Извините, 'SIZE', поскольку я использовал его, имел в виду как' #define SIZE 100'. –

3

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

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]) 
Смежные вопросы