函数警告 C: "warning: type of ‘char_array’ defaults to ‘int’"

function warnings C: "warning: type of ‘char_array’ defaults to ‘int’"

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

int myprint(char_array){
    char mystring[80];
    strcat(mystring, "\n");
    printf("%s", mystring);
    return 0;
}

int main(int argc, char** argv){
    int count = 5;
    char letter = 'c';
    printf("decimal: %d, char: %c\n", count, letter);

    myprint("sup");

    return 0;

}

我在编译时收到警告:

cchilders:~/projects/buildyourownlisp_in_C/ch3 [master]$ compile basics.c basics
basics.c: In function ‘myprint’:
basics.c:4:5: warning: type of ‘char_array’ defaults to ‘int’
 int myprint(char_array){
     ^

它可以编译,但是我的 myprint 函数不起作用:

cchilders:~/projects/buildyourownlisp_in_C/ch3 [master]$ ./basics 
decimal: 5, char: c

我看到了这个答案 warning: return type defaults to ‘int’ [-Wreturn-type] 但不适用于我,因为我确实声明了 int main(...)

我也看到了这个函数声明:

return_type function_name( parameter list ) {
   body of the function
}

而对于 myprint,我声明采用 int 和 return 0。这个警告是什么意思,为什么我的功能不起作用?谢谢

答案:

void myprint(char mystring[]){
    strcat(mystring, "\n");
    printf("%s", mystring);

}

消除警告,但导致 Segmentation fault (core dumped)

改为

void myprint(char[] mystring){
    strcat(mystring, "\n");
    printf("%s", mystring);

}

更糟:

cchilders:~/projects/buildyourownlisp_in_C/ch3 [master]$ cc -std=c99 -Wall basics.c -o basics
basics.c:4:21: error: expected ‘;’, ‘,’ or ‘)’ before ‘mystring’
 void myprint(char[] mystring;){
                     ^
basics.c: In function ‘main’:
basics.c:15:5: warning: implicit declaration of function ‘myprint’ [-Wimplicit-function-declaration]
     myprint("sup");
     ^

我也试过了

void myprint(char[] mystring;){...

void myprint(char[] mystring,){...

您没有为

中的 char_array 提供数据类型
int myprint(char_array)

您需要 char * 或您想要的任何内容。

int myprint(char_array)

什么类型有名称为char_array的参数?因为您没有指定它,所以编译器假定它是 int。幸运的是它会警告你。

不过,不要依赖这种行为。 (例如,我不知道这在 C11 中是否仍然合法)只需编写正确的函数声明,包括参数类型。

您需要指定您希望传递给函数的参数类型。功能上也有错误。 char_array 属于 char* 类型。您需要将传递的数组的每个部分复制到本地数组,然后才能调用 printf 才能使此函数工作

首先,函数定义应该是这样的

return-type function-name ( parameter-type parameter-name, parameter-type parameter-name)
{ ... }

您没有指定参数类型或参数名称。如果你想 char_array 表示一个类型,你需要先定义它,使用 typedef 或 struct 或其他东西。如果你的意思是char_array是一个参数名,你需要指定它的类型,如

char[] char_array

说。此外,在这种情况下,您实际上并没有在函数 myprint 的任何地方使用变量 char 数组。所以参数 "sup" 根本没有被使用。

编辑问题后:

尝试

char str[] = "sup";
myprint(str);

相反。据我所知,您不能按值传递字符串(字符数组)。

正如其他人所指出的,您没有为 char_array 指定类型,因此假定为 int。将其更改为 char char_array[] 可解决此问题。

您的另一个问题是您将字符串常量 ("sup") 传递给此函数,然后试图修改它。字符串常量存储在内存的只读部分,因此您不能修改它。

鉴于您只打印带有换行符的字符串,您可以改为这样做:

void myprint(char mystring[]){
    printf("%s\n", mystring);
}