указатель на массив в c - PullRequest
       5

указатель на массив в c

1 голос
/ 11 сентября 2011

Приведенная ниже программа выдает ошибку при инициализации (*a)[5]=((*)[])&v;. Когда я не набираю эту строку, я все равно получаю сообщение об ошибке.

int main()
{
    int v[10];
    int **p;
    int (*a)[5];
    (*a)[5]=((*)[])&v;
    printf("%d\n",*a);
    printf("%d\n",sizeof(v));
    return 0;
}

Ответы [ 4 ]

5 голосов
/ 11 сентября 2011

&v - это ссылка на массив int v, поэтому он имеет тип int ** (по существу). int (*a)[5] означает, что вы объявляете указатель на массив из 5 дюймов. НО, в следующей строке, когда вы пишете (*a)[5], это означает, что вы разыменовываете a, чтобы получить указатель int, а затем снова разыменовываете ссылку для доступа к элементу, хранящемуся в [5]. но массивы в C индексируются нулем, поэтому вы можете получить доступ только от [0] до [4], а [5] не выделено.

Вы хотите a = &v. Это сделает a указателем на int-указатель v. Существуют и другие проблемы, такие как *a - это указатель типа int, поэтому "%d" не будет летать, вы не указали никаких значений для a или v, ((*)[]) просто не нужно и т. Д.

4 голосов
/ 11 сентября 2011

Назначение переменной a должно иметь только a на LHS.

4 голосов
/ 11 сентября 2011

Когда вы имеете в виду ошибку, вы, вероятно, ссылаетесь на ошибку времени выполнения.int (* a) [5] - указатель на массив из 5-ти целых чисел, который никогда не инициализируется.Однако на следующей строке вы пытаетесь разыменовать его.Вы должны инициализировать «a» перед его использованием, возможно, вы пытаетесь инициализировать его с помощью v, но это не массив из 5-ти целых чисел.Если вам нужно переопределить v как int v [5], тогда a = & v должно сработать.

2 голосов
/ 11 сентября 2011

Я думаю, что это проще, чем вы ожидаете

#include <stdio.h>

int main()
{
    int v[10];
    int **p;
    int *a[5];

    v[0] = 1234;
    a[0] = v;

    printf("%d\n", *a[0]);
    printf("%d\n", sizeof(v));

    return 0;
}

* a [5] - это массив указателей типа int *. v [10] также является указателем на int.

То есть * a и a [0] фактически одно и то же.

ETA: Возможно printf ("% d \ n", a [0] [0]); лучше

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