Присваивание int ** указателю int - PullRequest
0 голосов
/ 15 апреля 2020

Извините, за странный вопрос. Я написал следующую программу:

#include <stdio.h>

int main()
{    
    int a[2];
    int **vararr = (int **)a;

    int testarr[]= {1, 2 ,3};
    printf("%d %d %d\n", testarr[0], testarr[1], testarr[2]);
    vararr[0] = (int *)testarr;
    printf("%d %d %d\n", testarr[0], testarr[1], testarr[2]);
    printf("%d %d %d\n", vararr[0][0], vararr[0][1], vararr[0][2]);
}

, которая возвращает:

1 2 3
32765 2 3
32765 2 3

Я ожидал: vararr[0][0] == 1 && testarr[0] == 1

Если я перезапущу Программу, 32765 изменится на + -2

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

Ответы [ 2 ]

3 голосов
/ 15 апреля 2020

int **vararr = (int **)a; является недопустимым преобразованием, поскольку типы несовместимы.

Указатель на указатель:

  • не является массивом
  • не является 2D массив
  • не может указывать на массив
  • не может указывать на 2D массив
  • может использоваться для указания на первый элемент массива указателей

Это означает, что если у вас нет int* array[n], лежащего где-то, нет смысла использовать int**.

Заменить int** на int* и все будет работать нормально.

1 голос
/ 15 апреля 2020

Вы переинтерпретируете указатель на целое число (распадающийся из массива) как указатель на указатель на целое число. Указанные типы (int и указатель на int) не являются взаимозаменяемыми по указателю, поэтому, когда вы пытаетесь получить доступ к указанному объекту путем косвенного обращения через переинтерпретированный указатель, поведение программы не определено.

I хотите массив указателей int

Вы можете объявить массив указателей int следующим образом:

int* ptr_arr[] {testarr};

Это массив из одного элемента. Элемент является указателем на int. Указывает на первый элемент testarr.

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