警告:return从具有不兼容 return 类型“float *”的函数中调用“float (*)[3]”

warning: returning ‘float (*)[3]’ from a function with incompatible return type ‘float *’

当我尝试 return 函数中的数组时出现错误 'warning: returning ‘float (*)[3]’ from a function with incompatible return type ‘float *’'。我读过 C 在 returning 数组方面存在问题,但并不真正理解为什么以及如何修复它。这是我的代码:

float * buildlocs(int L, int W, int H){
int c = 0, xmin, xmax, x, ymin, ymax, y, h;
unsigned int nX, nY;
L = L/4;
W = W/4;
float cellarray[16][3];


for(nX = 0; nX < 4;nX++) {
    for(nY = 0; nY < 4;nY++) {
        xmin = 0+L*(nX-1);
        xmax = L*nX;
        x = xmin+rand()*(xmax-xmin);
        
        ymin = 0+W*(nY-1);
        ymax = W*nY;
        y = ymin+rand()*(ymax-ymin);
        
        h = rand()*H;

        for(int i = 0; i < 3; i++){
            if(i == 0){
                cellarray[c][i] = x;                     
            }
            if(i == 1){
                cellarray[c][i] = y;  
            }
            if(i == 2){
                cellarray[c][i] = h;
            }

        }

        c = c + 1;
    }
}

return cellarray;
}

目标是拥有一个包含 16 个条目的二维数组,其中包含 3 个变量。有人可以帮我解决这个错误吗?

有两个问题:

首先,float[16][3] 而不是 float*。 其次,float cellArray[16][3] 在函数的末尾不再存在——它是一个只存在于该函数中的局部变量。当您 return 数组的地址时,指针将指向不存在的东西 - 所谓的 悬挂指针 .

要解决这个问题,您需要动态分配数组和 return 指向动态分配数组的指针,就像这样(完成 [=16 后不要忘记 free =]):

float* cellArray = malloc(sizeof(float)*16*3); // this is one contiguous block of floats, you have to figure out how you want to index into this block, since it's stricly speaking not a two dimensional array.
//...//
return cellArray;

或者,我觉得更优雅的是,将指针传递给一个已经存在的数组:

void buildlocs(float* outLocs, int L, int W, int H); // added parameter to take a float*

//in your function that calls buildlocs:

float[16][3] cellArray;
buildlocs(&cellArray[0],L,W,H); // pass allocated array into function, again, this is a pointer, not a two-dimensional array