Я играю с указателями и наткнулся на эту проблему.Как и в этом вопросе Я хотел подпись универсального метода для функции foo, поэтому я выбрал void * input
в качестве параметра.Из соображений тестирования я поместил указатель void на указатель int **
, чтобы использовать его как двумерный массив.
#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
segfaults и использование gdb показывает мне
(gdb) p ((int **)input)[i][j]
Cannot access memory at address 0x0
(gdb) p ((int **)input)+i+j
$25 = (int **) 0x405260
, поэтому очевидно, что есть разница.И поэтому я в замешательстве.