功能警告C:";警告:类型为‘;字符数组’;默认为‘;int’&引用;

功能警告C:";警告:类型为‘;字符数组’;默认为‘;int’&引用;,c,function-parameter,C,Function Parameter,它可以编译,但mymyprint函数不起作用: 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){ ^ 我看到了这个答案,但不适用于我,

它可以编译,但my
myprint
函数不起作用:

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){
     ^
我看到了这个答案,但不适用于我,因为我确实声明了
intmain(…)

我还看到了以下功能声明:

cchilders:~/projects/buildyourownlisp_in_C/ch3 [master]$ ./basics 
decimal: 5, char: c
对于
myprint
我声明采用
int
并返回
0
。这个警告是什么意思?为什么我的函数不能工作?多谢各位

答复:

return_type function_name( parameter list ) {
   body of the function
}
使警告静音,但会导致分段故障(堆芯转储)

改为

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

}
更糟糕的是:

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,){...
你需要char*或任何你想要的东西

int myprint(char_array)
什么类型的参数名为
char\u array
?因为您没有指定它,编译器假定它是
int
。幸运的是,它在警告你这一点


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

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

int myprint(char_array)
您没有指定参数类型或参数名称。如果将char_数组表示类型,则需要首先使用typedef或struct或其他方法定义它。如果要将char_数组作为参数名,则需要指定其类型,如下所示

return-type function-name ( parameter-type parameter-name, parameter-type parameter-name)
{ ... }
说。此外,在本例中,实际上在函数myprint中的任何位置都不使用变量char数组。因此,根本没有使用参数“sup”

编辑问题后:

试一试


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

正如其他人指出的,您没有为
char\u数组指定类型,因此假定它是
int
。将其更改为
char\u array[]
可以解决此问题

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

如果您只打印带有换行符的字符串,则可以执行以下操作:

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

更改为
char\u-array*
然后再更改
char\u-array[]
对它们都没有帮助。我现在看到了不匹配的情况,但更改语法使情况变得更糟,请参阅above@codyc4321请在上面的编辑之后尝试我的建议。那么如何手动添加\n?在函数内部创建一个新命名的变量并添加\n?@codyc4321您可以,但如果在函数外部看不到更改,则使用临时变量没有意义。其中有一个任性的分号:void myprint(char[]mystring;){
return-type function-name ( parameter-type parameter-name, parameter-type parameter-name)
{ ... }
char[] char_array
char str[] = "sup";
myprint(str);
void myprint(char mystring[]){
    printf("%s\n", mystring);
}