错误:在 C 中将数组作为参数传递时']'标记之前的预期表达式



我是C的新手。 正在写这个,所以它从传递的数组中获取字符串并使其成为一个句子。但是我得到了这个错误,我不擅长 C 中的数组。我可以从你们那里得到一些帮助。我确实为此寻找了答案,但找不到。

#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char smash(char arr[20][20]) {
char tmp[sizeof(arr)/sizeof(arr[0])];
for (int i=0; i < sizeof(arr)/sizeof(arr[0]); i++) {
strcat(tmp, arr[i]);
strcat(tmp, " ");
}
return tmp;
}
int main(){
char list[][6] = {"hello", "world"};
printf("%s", smash(list[]));
}

错误

error: expected expression before ']' token
printf("%s", smash(list[]));
^

这一小段代码中有很多错误。

首先,要解决编译器错误:list[]不是有效的表达式。 如果要将list传递给函数,请省略大括号:

printf("%s", smash(list));

这将带来另一个错误。 该函数期待一个char [20][20]作为参数,但这不是您要传入的内容。 由于数组作为参数被转换为指针,因此参数类型实际上是char (*)[20]即指向大小为 20 的char数组的指针。 另请注意,此转换仅针对最外层的数组维度发生,而不是全部。

由于您传递的char [2][6]被转换为char (*)[6]因此这是类型不匹配。 因此,将参数更改为char arr[][6].

然后,您尝试获取函数内部数组参数的大小:

sizeof(arr)/sizeof(arr[0])

由于前面提到的转换,数组不能直接传递给函数,因此arr实际上是一个指针而不是数组,因此您不会从中获得预期的结果。 您需要将数组元素的数量作为单独的参数传递。

然后你在tmp上打电话给strcat. 仅当目标中已具有以 null 结尾的字符串时,此函数才有效。 由于tmp在第一次调用strcat之前没有初始化或写入,你最终会读取未初始化的字节,并可能超过数组的末尾,这将触发未定义的行为。

这可以通过在循环之前将数组的第一个字节设置为 0 来修复,使其成为空字符串:

tmp[0] = 0;
for ...

然后是返回类型的问题。 声明该函数返回char但您正在对 return 语句进行char *,并且在调用该函数时,该函数将传递到%s格式说明符需要char *参数的printf

因此,将函数的返回类型从char更改为char *

最后,您将返回指向函数中局部变量的指针。 此变量的生存期在函数返回时结束,因此返回的指针无效,使用它也会触发未定义的行为。

您需要将tmp更改为指针,并使用malloc为其动态分配内存。 这也意味着您需要将函数的返回值保存在一个单独的变量中,然后您可以将其传递给printf进行打印,然后传递给free以释放内存。

进行所有这些更改后,生成的代码应如下所示:

char *smash(char arr[][6], int len) {
// enough for len strings plus len spaces
char *tmp = malloc(sizeof(arr[0]) * len + len + 1); 
tmp[0] = 0;
for (int i=0; i < len; i++) {
strcat(tmp, arr[i]);
strcat(tmp, " ");
}
return tmp;
}
int main(){
char list[][6] = {"hello", "world"};
char *result = smash(list, sizeof(list)/sizeof(list[0]));
printf("%s", result);
free(result);
return 0;
}

最新更新