【发布时间】:2022-01-16 15:31:59
【问题描述】:
我在 C 中有一个任务,用户必须填充一个 2D grades[3][3] 数组。然后调用一个函数,该函数返回指向main() 的指针,其中包含该数组中最大元素的地址。
所以,我定义了一个 int *get_max() 函数,其主体如下:
int *get_max(float *gradesPtr)
{
int i, j, *max_addr = &i; //variable initialization
float max = *gradesPtr, curr_element; //max gets the value of the 1st element in the array to not be empty
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
curr_element = *(gradesPtr + i*3 + j); //(pointer + i*columns + j) formula used here
if (curr_element > max)
{
max = curr_element; //get max element
*max_addr = gradesPtr + i*3 + j; //get address of max element
}
}
}
return max_addr; //return "max_addr" to main
}
它是从main() 调用的,如下所示:
int *max_element = get_max((float *)grades);
代码似乎正确,因为我可以通过 Visual Studio 中的 Watch 菜单验证它在第一次迭代时运行良好,并且变量具有正确的值。但是,在第 2 次迭代中,它没有正常继续,而是在 curr_element = *(gradesPtr + i*3 + j); 行上引发访问冲突错误。
在调试了一下之后,似乎无论我如何将数组传递给函数(使用指向数组的指针或传递整个数组本身),也不管我如何将最大元素的地址保存到*max_addr(使用 (pointer + i*columns + j) 公式或 &grades[i][j]),get_max() 函数将数组视为 一维数组而不是二维数组,从而引发访问冲突错误。在这里搜索提供了一些好看的解决方案,但它们不是我想要的。
这里有什么我遗漏的吗?
【问题讨论】:
-
max_element是一个[简单]int,但get_max返回int *(一个指针)。那么,这是如何编译的呢? -
@CraigEstey 哎呀,我的错。
max_element是在原文件开头初始化的,我忘了把星号放在这里。
标签: c multidimensional-array access-violation