Как я могу назначить указатель на массив [] в c? - PullRequest
0 голосов
/ 11 июня 2018

Как я могу назначить указатель на массив в c?Как и в этом примере, я хочу, чтобы some.x имел значения, хранящиеся в vals

typedef struct s
{
    int x[];
}s;

int main()
{   
    int* vals = malloc(sizeof(int) * 10);
    for (int i = 0; i < 10; i++)
        vals[i] = i + 10;

    s some;
    //some.x = vals?

    return 0;
}

Ответы [ 3 ]

0 голосов
/ 11 июня 2018

Массивы не указатели, вот и все.

0 голосов
/ 11 июня 2018

Предполагая, что вы хотите выделить структуру с помощью элемента гибкого массива, а не назначить указатель на массив (что, как говорили другие - вы не можете этого сделать)

Чтобы использовать гибкий элемент массива, вам необходимо выделить структуру плюс объем памяти для массива.

typedef struct s
{
    int x[];
}s;

int main()
{   
    s *some = malloc( sizeof( *some ) + ( 10 * sizeof( int ) ) );
    for ( int i = 0; i < 10; i++ )
        some->x[i] = i + 10;

    return 0;
}

Обратите внимание, что вы не можете оставить sizeof( struct ... ) израспределение - присутствие структуры не гарантируется равным нулю, даже когда элемент гибкого массива является единственным полем в структуре.

Как отметил @chux в комментариях, это будет более согласованно с использованием переменных вместоТипы sizeof() аргументы:

    s *some = malloc( sizeof( *some ) + ( 10 * sizeof( some->x[0] ) ) );
0 голосов
/ 11 июня 2018

Вы не можете делать то, что хотите.Это вне стандарта C11 n1570 .

Массивы распадаются на указатели, но не наоборот.Вы не можете присвоить массив.

Так что используйте систематически указатели.

И ваш код не может иметь никакого смысла: подумайте о sizeof задействованных данных!

Читать о гибких членах массива .Вы будете использовать указатели на struct, содержащие их.

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