Передача простого указателя в качестве двойного указателя на функцию - PullRequest
0 голосов
/ 13 января 2019

Я должен написать программу, которая умножает два вектора для моего класса кодирования, и типы аргументов реализованных функций устанавливаются нашим учителем.

Не могу понять, как передать векторы, являющиеся одномерными массивами, в виде двойных указателей на одну из реализованных функций.

Я попытался использовать адрес-оператор, так как я хочу указать на адрес начала массива, где функция должна зарезервировать пространство памяти для массива. Но компилятор всегда говорит мне

incompatible pointer type, expected int **

и он не работает без оператора.

//all functions set by worksheet
int array_create(int **v, int n);//function with double pointer argument
void array_init(int *v, int n);
int mult_array(int *x, int *y, int n);

int main(void)
{
    int i, j;
    int x[10];
    int y[10];
    srand(time(NULL));
    array_create(x, 7); // see here
    array_create(y, 7); // see here
    array_init(x, 7);
    array_init(y, 7);
    printf("\nResult: %i", mult_array(x, y, 7));
    array_destroy(x);
    array_destroy(y);
    return 0;
}

int array_create(int **v, int n)
{

    v = malloc(n * sizeof(int));
    if(!v){
        return 0;
    }
    return 1;
}

1 Ответ

0 голосов
/ 13 января 2019

явно цель array_create состоит в том, чтобы выделить и сохранить адрес в первом параметре, поэтому измените его на:

int array_create(int **v, int n)   
{
  *v = malloc(n * sizeof(int));
  if(!*v){
      return 0;
  }
  return 1;
}

Вам нужно позвонить правильно:

int * x;
int * y;
srand(time(NULL));
array_create(&x, 7);
array_create(&y, 7);

x и y теперь содержат адреса выделенных блоков памяти (при условии, что памяти достаточно). в то время как array_create возвращает 0 или 1, может быть хорошей идеей проверить возвращаемое значение ;-).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...