声明一个字符指针数组(arg传递)

时间:2010-05-04 22:18:04

标签: c

这应该很容易回答,但我更难在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>
}

所以我意识到我的tokenize函数中不能有char tokens[][],但如果我放入char **tokens,我会收到编译器警告。此外,当我尝试使用tokens[i][j] = <A CHAR>将char放入我的char数组时,我发生了段错误。

我哪里错了? (以及有多少种方式......我该如何解决它?)

非常感谢!

2 个答案:

答案 0 :(得分:5)

您需要指定数组第二维的大小:

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

这样,编译器知道当你说tokens[2][5]时它需要做类似的事情:

  1. 找到tokens
  2. 的地址
  3. 在开始时移动2 * SIZE个字节
  4. 再移动 地址
  5. 5个字节
  6. ???
  7. 利润!
  8. 按照目前的情况,如果没有指定第二个维度,如果你说tokens[2][5]它怎么知道去哪里?

答案 1 :(得分: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])