字符串数组中的指针类型警告不兼容

我在C中尝试字符串数组。我有一个字符串数组,我添加单词,然后打印出数组,看看它是否有效。 正如我认为的那样,输出可以打印数组中的单词。 但是我得到了一些我无法解决的警告。

// 20 word dictionary #define ROWS 20 #define WORD_LENGTH 10 char dictionary[ROWS][WORD_LENGTH]; void add_word(char **dict, int index, char *word) { dict[index] = word; } char *get_word(char **dict, int index) { return dict[index]; } void print_dictionary(char **dict) { int i; for (i = 0; i < 20; i++) { printf("%d: %s\n", i, get_word(dict, i)); } } void test_dictionary() { add_word(dictionary, 0, "lorem"); add_word(dictionary, 1, "ipsum"); print_dictionary(dictionary); } int main() { test_dictionary(); } 

编译这个的输出是,

 p5.c: In function 'test_dictionary': p5.c:54:2: warning: passing argument 1 of 'add_word' from incompatible pointer type [enabled by default] p5.c:38:6: note: expected 'char **' but argument is of type 'char (*)[10]' p5.c:55:2: warning: passing argument 1 of 'add_word' from incompatible pointer type [enabled by default] p5.c:38:6: note: expected 'char **' but argument is of type 'char (*)[10]' p5.c:57:2: warning: passing argument 1 of 'print_dictionary' from incompatible pointer type [enabled by default] p5.c:46:6: note: expected 'char **' but argument is of type 'char (*)[10]' 

我尝试将** dict更改为dict [ROWS] [WORD_LENGTH]没有太大区别。 你能解释一下如何声明这个字典参数吗? 谢谢。

编辑:我的编译器标志是,CFLAGS = -Wall -g。

Edit2:将声明更改为,

 void add_word(char dict[][WORD_LENGTH], int index, char *word) { dict[index] = word; } char *get_word(char dict[][WORD_LENGTH], int index) { return dict[index]; } void print_dictionary(char dict[][WORD_LENGTH]) { int i; for (i = 0; i < 20; i++) { printf("%d: %s\n", i, get_word(dict, i)); } } 

这给出了编译错误,

 p5.c: In function 'add_word': p5.c:42:14: error: incompatible types when assigning to type 'char[10]' from type 'char *' make[1]: *** [p5] Error 1 

谢谢你的帮助。

啊! 弄清楚了!。 因为它是一个指针,我需要使用@Jack建议的strcpy。

 void add_word(char dict[][WORD_LENGTH], int index, char *word) { /*dict[index] = word;*/ strcpy(dict[index], word); } 

感谢大家!

根本原因:

数组不是指针!

请注意,没有从dict[][]dict **隐式转换,因此也没有错误。 当你将一个数组传递给一个函数时,它会衰减为指向它的第一个元素的指针。在二维数组的情况下,第一个元素是单个维数本身的数组,所以你需要一个指向数组的指针,而不是一个双指针。

Soultion:

您需要修改函数原型以匹配您传递的类型

 void add_word(char dict[][WORD_LENGTH], int index, char *word); void print_dictionary(char dict[][WORD_LENGTH]); 

事实是你真的没有传递一个指向指针的指针,而是一个数组数组。 不同之处在于已经分配了内存,并且您无法在add_word()中使用赋值运算符“=”。

正确的签名将是

 void add_word(char dict[][WORD_LENGTH], int index, char *word) 

并且您必须使用strcpy或strncpy之类的方法

在解除引用时,您需要提供内部数组的大小。 所以代替:

 void add_word(char **dict, int index, char *word) 

你需要:

 void add_word(char dict[][WORD_LENGTH], int index, char *word) 

对于print_dictionary

主要的困惑是char 数组的数组与char 指针数组不同。

是的,你的类型是完全关闭的。

修复的“最小更改次数”是替换一行:

 char* dictionary[ROWS]; 

基本上,你确实创建了一个内存块作为

 c1 c2 c3 c4 ... c20 c21 c22 c23 c24 ... c40 c41 c42 ... ... 

但是,你把它用作内存块

 charpointer1 charpointer2 charpointer3 ... 

它似乎工作,并且你的实际分配的内存块无论如何都是更大的,所以它甚至是“安全的”,从某种意义上来说,没有任何不好的事情会发生。

编辑:如果你曾试图直接使用你的“字典”,你的代码将“爆炸”; 访问例如“dictionary [n]”来获得第n个单词会给你错误的结果。