函数警告 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);
}
#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);
}