Подтвердить что ты не робот

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

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

Я хочу сделать глобальный указатель на массив структур:

typdef struct test
{
    int obj1;
    int obj2;
} test_t;

extern test_t array_t1[1024];
extern test_t array_t2[1024];
extern test_t array_t3[1025];

extern test_t *test_array_ptr;

int main(void)
{
    test_array_ptr = array_t1;

    test_t new_struct = {0, 0};
    (*test_array_ptr)[0] = new_struct;
}

Но это дает мне предупреждения. Как мне получить доступ к конкретным структурам с помощью []?

Аналогично, как мне создать массив указателей типа struct? test_t *_array_ptr[2];?

4b9b3361

Ответ 1

Синтаксис, который вы ищете, несколько громоздкий, но выглядит так:

// Declare test_array_ptr as pointer to array of test_t
test_t (*test_array_ptr)[];

Затем вы можете использовать его так:

test_array_ptr = &array_t1;
(*test_array_ptr)[0] = new_struct;

Чтобы упростить понимание синтаксиса, вы можете использовать typedef:

// Declare test_array as typedef of "array of test_t"
typedef test_t test_array[];
...
// Declare test_array_ptr as pointer to test_array
test_array *test_array_ptr = &array_t1;
(*test_array_ptr)[0] = new_struct;

Утилита cdecl полезна для расшифровки сложных объявлений C, особенно когда задействованы массивы и указатели функций.

Ответ 2

test_t * test_array_ptr является указателем на test_t. Это может быть указатель на единственный экземпляр test_t, но он может быть указателем на первый элемент массива экземпляров test_t:

test_t array1[1024];

test_t *myArray;
myArray= &array1[0];

это означает, что myArray указывает на первый элемент array1, а арифметика указателя позволяет обрабатывать этот указатель как массив. Теперь вы можете получить доступ к 2-му элементу array1 следующим образом: myArray[1], который равен *(myArray + 1).

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

test_t array1[1024];
test_t array2[1024];
test_t array3[1025];

test_t **arrayPtr;
arrayPtr = malloc(3 * sizeof(test_t*));   // array of 3 pointers
arrayPtr[0] = &array1[0];
arrayPtr[1] = &array2[0];
arrayPtr[2] = &array3[0];

Ответ 3

Проблема заключается в том, что вы берете (*test_array_pointer), который является первым элементом массива. Если вы хотите назначить конкретный элемент массива, вы сделаете следующее...

function foo()
{
    test_array_ptr = array_t1;

    test_t new_struct = {0,0};
    memcpy( &test_array_ptr[0], &new_struct, sizeof( struct test_t ) );
}

если вы хотите всегда назначать первый элемент массива, вы могли бы это сделать...

function foo()
{
    test_array_ptr = array_t1;

    test_t new_struct = {0,0};
    memcpy( test_array_ptr, &new_struct, sizeof( struct test_t ) );
}

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

function foo()
{
    test_array_ptr = array_t1;

    test_t new_struct = {0,0};
    test_array_ptr[0] = new_struct;
}

Ответ 4

Я бы использовал указатель на указатель вроде:

test_t array_t1[1024];
test_t **ptr;
ptr = array_t1;
ptr[0] = ...;
ptr[1] = ...;
etc.