Назначить массив int в указателе в структуре - PullRequest
0 голосов
/ 08 февраля 2019

Я создал ниже структуру С.

typedef struct KnightsMartSale {
char firstName[21];
char lastName[21];
int numItemsOnList;
int *itemsPurchased; // array of item numbers
struct KnightsMartSale *next;
} KMSale;

Здесь можно присвоить массив int указателю int * itemsPurchased ?Если это возможно, как распечатать значения?

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

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

KMSale foo; // sample struct on stack, not initialized!
int my_buffer[12]; // not initialized stack buffer!

/* Assign pointer */
foo.itemsPurchased = my_buffer; // point to my_buffer

/* Print the first element via the struct... */
printf("%02x", foo.itemsPurchased[0]);
0 голосов
/ 08 февраля 2019

Здесь можно присвоить массив int указателю int * itemsPurchased?Если возможно, как вывести значения?

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

Но это назначение следует использоватьочень осторожно, так как массив будет переменной стека, и область действия переменной должна быть рассмотрена перед обращением к указателю этой структуры

Также этот метод может быть предпочтительнее динамического выделения памяти, где фрагментация памяти является проблемой для malloc и free.и мы можем избежать издержек динамического выделения.

Ниже приведен код для этого и вывод значения печати в массиве:

#include <stdio.h>

typedef struct KnightsMartSale {
    char firstName[21];
    char lastName[21];
    int numItemsOnList;
    int *itemsPurchased; // array of item numbers
    struct KnightsMartSale *next;
} KMSale;

int main() {

    KMSale sale;
    int iPos = 0;

    int Array[] = {1, 2, 3, 4, 5};

    sale.numItemsOnList = sizeof(Array) / sizeof(Array[0]);
    sale.itemsPurchased = Array;

    for (iPos=0; iPos < sale.numItemsOnList; iPos++) {
        printf("sale %d: %d\n", iPos, sale.itemsPurchased[iPos]);
    }

    return 0;
}

output:

sale 0: 1
sale 1: 2
sale 2: 3
sale 3: 4
sale 4: 5
0 голосов
/ 08 февраля 2019

Я бы выделил память в соответствии с размером массива, в который вы хотите скопировать itemsPurchased, а также "запомнил" количество возможных элементов в numItemsOnList.

Итак, предположим, у вас есть заданныймассив массива, скажем, myArray, тогда код для копирования и печати может выглядеть следующим образом:

typedef struct KnightsMartSale {
    char firstName[21];
    char lastName[21];
    int numItemsOnList;
    int *itemsPurchased; // array of item numbers
    struct KnightsMartSale *next;
} KMSale;

int main() {

    KMSale kmsale;

    int myArray[] = { 20,30,40,50 };

    kmsale.numItemsOnList = sizeof(myArray)/sizeof(myArray[0]);
    kmsale.itemsPurchased = calloc(kmsale.numItemsOnList,sizeof(int));
    memcpy(kmsale.itemsPurchased,myArray,kmsale.numItemsOnList*sizeof(int));

    for (int i=0; i<kmsale.numItemsOnList; i++) {
        printf("item #%d: %d\n",i,kmsale.itemsPurchased[i]);
    }


    // kmsale not needed any more, free memory:
    free(kmsale.itemsPurchased);
}

Вывод:

item #0: 20
item #1: 30
item #2: 40
item #3: 50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...