簡體   English   中英

將int數組分配給struct中的指針

[英]Assign int array to in pointer in struct

我創建了下面的C struct。

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

這可以將int數組分配給int * itemsPurchased指針嗎? 如果有可能打印值?

我根據要復制到itemsPurchased的數組的大小來分配內存,並“記住” numItemsOnList中可能的項目數。

所以假設你有一個給定的int數組,比如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

只是一些快速的原型編碼...也許它可能會引導你進入正確的方式......

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]);

這可以將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;
}

輸出:

sale 0: 1
sale 1: 2
sale 2: 3
sale 3: 4
sale 4: 5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM