名为object的错误不是函数或函数指针

时间:2016-06-20 14:20:23

标签: 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(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;
} 

编译此代码会产生错误

  

称为对象的错误不是函数或函数指针

3 个答案:

答案 0 :(得分:2)

主要

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

名为Matrix的局部变量声明为

    int** Matrix;

在声明

中引用自身
    Matrix=Matrix(buffer);

然而这个表达

Matrix(buffer)
对于指针,

在C中无效。

很明显,您的意思是具有相同名称Matrix的功能。但在使用它之前必须至少在全局命名空间中声明它。而且局部变量将隐藏函数的名称。

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

#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
} 

考虑到功能本身也是不正确的。例如,在本声明中

for(j=0;j<sizeof(buffer)/sizeof(int);j++){

sizeof(buffer)并不意味着用作参数的数组的大小。它意味着int *类型指针的大小 因此,例如表达式

sizeof(buffer)/sizeof(int)

可能等于2或1,具体取决于sizeof( int * )是否等于8或4,相应地sizeof( int )也等于8或4。

答案 1 :(得分:1)

在您的代码中,您有一个变量和一个具有相同名称(标识符)的函数。

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

  

[...]如果标识符指定同名的两个不同实体   空间,范围可能重叠。如果是这样,一个实体(内部范围)的范围将结束   严格地在另一个实体的范围之前(外部范围)。 在内部范围内,   identifier指定在内部作用域中声明的实体;在外部宣布的实体   范围在内部范围内隐藏(并且不可见)。

现在,在main()内,变量Matrix在本地范围内,它优先于(flie scope)函数名称(也是Matrix),因此函数不是<来自main()的em> visible 会导致错误。

更改任一标识符以使它们都是唯一的。

另外,正如TZof在另一个答案中正确提到的那样,如果函数在定义之前已经使用,编译器无法知道函数返回类型和参数详细信息。做任何一件事

答案 2 :(得分:0)

有两个错误:

  1. 变量和具有相同名称Matrix
  2. 的函数
  3. 函数Matrix在main函数下,但gcc无法建立函数Matrix的链接。它没有识别功能。将矩阵功能放在主要功能之上。