【问题标题】:function warnings C: "warning: type of ‘char_array’ defaults to ‘int’"函数警告 C:“警告:‘char_array’的类型默认为‘int’”
【发布时间】:2016-02-25 00:44:20
【问题描述】:
#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 并返回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,){...

【问题讨论】:

  • 里面有个任性的分号:void myprint(char[] mystring;){

标签: c function-parameter


【解决方案1】:

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

您的另一个问题是您将字符串常量 ("sup") 传递给此函数,然后尝试对其进行修改。字符串常量存储在内存的只读部分中,因此您无法修改它。

鉴于您只使用换行符打印字符串,您可以这样做:

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

【讨论】:

  • 那么我该如何手动添加 \n 呢?在函数内部创建一个新命名的变量并添加 \n?
  • @codyc4321 可以,但是如果在函数外部看不到更改,则使用临时变量毫无意义。
【解决方案2】:

您没有在

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

你需要 char * 或任何你想要的。

【讨论】:

  • 更改为 char_array* 然后 char_array[] 也没有帮助
【解决方案3】:

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

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

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

【讨论】:

  • 我现在看到了不匹配,但是更改语法会使情况变得更糟,请参见上文
  • @codyc4321 试试我在上面编辑后的建议。
【解决方案4】:
int myprint(char_array)

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

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 2012-09-04
      • 2020-10-19
      • 2013-04-24
      • 2022-11-02
      • 2017-08-07
      • 1970-01-01
      • 2020-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多