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;
}