警告是正确的.你的函数想要一个指针数组.你给它一个数组的数组.
预期:
sep_foo:
+------+ +-----+
|char**|--> 0: |char*|-->"string1"
+------+ +-----+
1: |char*|-->"string2"
+-----+
*sep_foo_qty-1: |... |
+-----+
你提供的:
sep_foo:
+--------------------------------+
0: | char[MAX_STRING_LENGTH] |
+--------------------------------+
1: | char[MAX_STRING_LENGTH] |
+--------------------------------+
MAX_QTY-1: | ... |
+--------------------------------+
具有类型X的元素的数组可以“衰减”成指向X或X *的指针.但是X的值不能在该转换中改变.只允许一次衰减操作.你需要发生两次.在你的情况下,X是数组的MAX_STRING_LENGTH-chars.该函数希望X是指针到字符.由于这些不一样,编译器会警告您.我有点惊讶,这只是一个警告,因为编译器允许发生的事情没有任何好处.
在你的函数中,你可以编写这个代码:
char* y = NULL;
*sep_foo = y;
这是合法的代码,因为sep_foo是一个char **,所以* sep_foo是一个char *,y也是;你可以分配它们.但是用你试图做的,* sep_foo不会真的是一个char *;它会指向一个char数组.你的代码实际上会试图这样做:
char destination[MAX_STRING_LENGTH];
char* y = NULL;
destination = y;
您不能将指针分配到数组中,因此编译器会警告该调用并不好.
有两种方法可以解决这个问题:
>更改您在呼叫方声明和分配sep_foo的方式,以便它匹配函数期望接收的内容:
char** sep_foo = calloc(MAX_QTY, sizeof(char*));
for (int i = 0; i < MAX_QTY; ++i)
sep_foo[i] = malloc(MAX_STRING_LENGTH);
或等效地
char* sep_foo[MAX_QTY];
for (int i = 0; i < MAX_QTY; ++i)
sep_foo[i] = malloc(MAX_STRING_LENGTH);
>更改函数的原型以接受您真正给予的内容:
int parse(const char *foo, char sep_foo[MAX_QTY][MAX_STRING_LENGTH], int *sep_foo_qty);