error: expected expression before ']' token when passing an array as an arguement in C
error: expected expression before ']' token when passing an array as an arguement in 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]
即指向数组的指针char
的大小为 20。另请注意,此转换仅发生在最外层的数组维度上,而不是全部。
由于您传入的 char [2][6]
会转换为 char (*)[6]
,这是类型不匹配。所以把参数改成char arr[][6]
.
然后您试图获取函数内部数组参数的大小:
sizeof(arr)/sizeof(arr[0])
由于前面提到的转换,数组不能直接传递给函数,所以arr
实际上是一个指针而不是数组,所以你不会得到你期望的结果。您需要将数组元素的数量作为单独的参数传递。
那么您将在 tmp
上呼叫 strcat
。此函数仅在目标中已有空终止字符串时才有效。由于 tmp
在第一次调用 strcat
之前未被初始化或写入,您最终会读取未初始化的字节并可能超过数组的末尾,这将触发 undefined behavior.
这可以通过在循环之前将数组的第一个字节设置为 0 使其成为空字符串来解决:
tmp[0] = 0;
for ...
然后是return类型的问题。该函数被声明为 return a char
但是你给 return 语句一个 char *
,并且在函数被调用时它被传递给 printf
其中 %s
格式说明符需要一个 char *
参数。
因此将函数的 return 类型从 char
更改为 char *
。
最后,您 return 指向函数中局部变量的指针。此变量的生命周期在函数 returns 时结束,因此 returned 指针无效,使用它也会触发未定义的行为。
您需要将 tmp
更改为指针并使用 malloc
为其动态分配内存。这也意味着您需要将函数的 return 值保存在一个单独的变量中,然后您可以将其传递给 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;
}
我是 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]
即指向数组的指针char
的大小为 20。另请注意,此转换仅发生在最外层的数组维度上,而不是全部。
由于您传入的 char [2][6]
会转换为 char (*)[6]
,这是类型不匹配。所以把参数改成char arr[][6]
.
然后您试图获取函数内部数组参数的大小:
sizeof(arr)/sizeof(arr[0])
由于前面提到的转换,数组不能直接传递给函数,所以arr
实际上是一个指针而不是数组,所以你不会得到你期望的结果。您需要将数组元素的数量作为单独的参数传递。
那么您将在 tmp
上呼叫 strcat
。此函数仅在目标中已有空终止字符串时才有效。由于 tmp
在第一次调用 strcat
之前未被初始化或写入,您最终会读取未初始化的字节并可能超过数组的末尾,这将触发 undefined behavior.
这可以通过在循环之前将数组的第一个字节设置为 0 使其成为空字符串来解决:
tmp[0] = 0;
for ...
然后是return类型的问题。该函数被声明为 return a char
但是你给 return 语句一个 char *
,并且在函数被调用时它被传递给 printf
其中 %s
格式说明符需要一个 char *
参数。
因此将函数的 return 类型从 char
更改为 char *
。
最后,您 return 指向函数中局部变量的指针。此变量的生命周期在函数 returns 时结束,因此 returned 指针无效,使用它也会触发未定义的行为。
您需要将 tmp
更改为指针并使用 malloc
为其动态分配内存。这也意味着您需要将函数的 return 值保存在一个单独的变量中,然后您可以将其传递给 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;
}