C 错误调用对象不是函数或函数指针

C 错误调用对象不是函数或函数指针,c,function,C,Function,我这段简单的代码有一个错误。我不明白为什么 #include <stdio.h> #include <stdlib.h> int main(int argc, char ** argv){ int buffer[4]={1,2,3,4}; int** Matrix; Matrix=Matrix(buffer); } int** Matrix(int* buffer){ int ** Matrix; Matrix= malloc

我这段简单的代码有一个错误。我不明白为什么

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char ** argv){
    int buffer[4]={1,2,3,4};
    int** Matrix;
    Matrix=Matrix(buffer);
}


int** Matrix(int* buffer){
    int ** Matrix;
    Matrix= malloc(sizeof(buffer)*sizeof(buffer));
    int j,i;
    for(j=0;j<sizeof(buffer)/sizeof(int);j++){
        for(i=0;i<sizeof(buffer)/sizeof(int);i++){
            Matrix[j][i]=buffer[i];}}
    return Matrix;
} 
#包括
#包括
int main(int argc,字符**argv){
int缓冲区[4]={1,2,3,4};
int**矩阵;
矩阵=矩阵(缓冲器);
}
整数**矩阵(整数*缓冲区){
int**矩阵;
矩阵=malloc(sizeof(缓冲区)*sizeof(缓冲区));
int j,i;

对于代码中的(j=0;j,您得到了一个具有相同名称(标识符)的变量和函数

引用
C11
,第§6.2.1章,标识符范围

[…]如果标识符以相同的名称指定两个不同的实体 如果是,则一个实体的作用域(内部作用域)将结束 严格在其他实体的范围之前(外部范围)。在内部范围内 标识符指定在内部范围中声明的实体;在外部范围中声明的实体 范围在内部范围内隐藏(不可见)。

现在,在
main()
内部,变量
Matrix
位于局部范围内,它优先于(flie scope)函数名(也就是
Matrix
),因此该函数在
main()
中不可见,从而导致错误

更改其中一个标识符以使它们都唯一

另外,正如在另一个答案中正确提到的,如果函数在定义之前已经使用过,编译器将无法知道函数返回类型和参数的详细信息

  • 将函数定义移到
    main()之前
  • main()
    • 有两个错误:

    • 具有相同名称的变量和函数
      Matrix
    • 函数矩阵位于主函数之下,但gcc无法建立函数矩阵的链接。它没有标识函数。将矩阵函数置于主函数之上
    • 大体上

      int main(int argc, char ** argv){
          int buffer[4]={1,2,3,4};
          int** Matrix;
          Matrix=Matrix(buffer);
      }
      
      名称矩阵声明为like的局部变量

          int** Matrix;
      
      在语句中引用自身

          Matrix=Matrix(buffer);
      
      for(j=0;j<sizeof(buffer)/sizeof(int);j++){
      
      然而这句话

      Matrix(buffer)
      
      sizeof(buffer)/sizeof(int)
      
      在C中对指针无效

      显然,您指的是具有相同名称矩阵的函数。但在使用它之前,必须至少在全局命名空间中声明它。此外,局部变量将隐藏函数的名称

      因此,应该为指针和函数使用不同的名称

      #include <stdio.h>
      #include <stdlib.h>
      
      int** Matrix(int* buffer);
      
      int main(int argc, char ** argv){
          int buffer[4]={1,2,3,4};
          int** m;
          m = Matrix(buffer);
      }
      
      
      int** Matrix(int* buffer){
          //... the body of the function
      } 
      

      可能等于2或1,这取决于
      sizeof(int*)
      是否等于8或4,以及相应的
      sizeof(int)
      也等于8或4。

      在C中尝试用相同的名称命名变量和函数通常是不明智的。错误是编译错误、编译警告还是算法错误?我们很难猜测,大多数人可能会跳过这个问题,因为我们不知道您期望的是什么。告诉我们什么t表示问题,以及您可能拥有的任何输入和(非)预期输出。我的意思是函数矩阵返回一个int**并且我的对象矩阵也是int**类型。为什么gcc说它不是函数或函数指针
      ,但gcc必须在main下没有函数。
      您能引用一些东西吗?“…gcc必须在main下没有函数。”就目前情况而言,这是胡说八道。事实上,我的英语很抱歉。gcc不知道矩阵函数的返回类型。