c - 访问作为 void 指针段错误传递的 int 数组
问题描述
我正在玩指针并偶然发现了这个问题。就像在这个问题中一样,我想要函数 foo 的通用方法签名,因此我选择了void * input
作为参数。出于测试原因,我将 void 指针转换为一个int **
指针,以便像 2D 数组一样使用它。
#include <stdio.h>
#include <stdlib.h>
void * foo(void *input, size_t mySize)
{
for (size_t i = 0; i < mySize; ++i)
{
for (size_t j = 0; j < mySize; ++j)
{
((int **)input)[i*mySize][j] = 10*i+j;
}
}
return input;
}
int main(int argc, char const *argv[])
{
size_t const mySize = 10;
void * myMemory, * testPtr;
myMemory = malloc(mySize * mySize * sizeof(int));
testPtr = foo(myMemory, mySize);
free(testPtr);
return 0;
}
现在我认为使用[]
运算符与向指针添加一个 int 相同,例如,((int **)input[i][j]
这与 `((int **)input)+i+j 相同
但是在段错误中访问输入数组foo
并使用 gdb 向我展示了
(gdb) p ((int **)input)[i][j]
Cannot access memory at address 0x0
(gdb) p ((int **)input)+i+j
$25 = (int **) 0x405260
所以显然有区别。因此我很困惑。
解决方案
您分配了一个带有 mySize*mySize 元素的一维数组。int** 是一个指向 int 的指针数组,你想要的是
int **array2d;
int *p;
array2D = malloc(ROWS * sizeof(int*) + ROWS * COLUMNS * sizeof(int));
p = (int*) &array2d[ROWS];
for (size_t i = 0; i < ROWS; ++i)
array2d[i] = &p[i * COLUMNS];
现在 array2d[row][column] 可以工作了。
或者,如前所述,使用一维数组并使用数组[row * COLUMNS + column] 公式。
推荐阅读
- c# - XmlReader 值不通过我的 If 语句,但它应该
- reactjs - “登录”类型上不存在属性“handleSubmit”.ts(2339)
- python - 导入flask-WTF时出现AttributeError
- sorting - 如何显示与 Frobenius 问题和 Shell 排序的关系?
- laravel - 当我使用 laravel 在搜索栏中写类别名称时,如何显示与该类别相关的自动产品列表?
- html - 下拉菜单
- c# - 使用 XML 从 Element 获取价值
- zend-framework3 - ZF3 高级路由 - 使用 HTTP 方法
- c++ - C++ 使用解构迭代对向量
- c# - 模拟控制器返回 NULL