iT邦幫忙

0

動態記憶體分配邏輯詢問

  • 分享至 

  • xImage

雖然作業問題在這裡問不太好,但還是想搞清楚到底該怎麼做
以下是我修改作業的程式碼

#include <stdio.h>
#include <stdint.h>
typedef struct _sScore
{
    uint8_t number; //下面score的數量
    uint8_t *score; //假設上面number=5,score就會有5個elements,score會介於0~9
}sScore;

sScore *score_init(void);
void score_free(sScore *);
int32_t score_set(sScore *s, char *ptr) //s是初始化後的變數,ptr要將s中的score設值

int main()
{
    return 0;
}

剛才問題沒問好,重新修改一下。
這隻程式剛開始要先利用score_init配置記憶體空間還要初始化為0
之後會利用score_set看ptr中有幾個數字(假設5個數字),就將number設成5,然後再把s裡面的score設成ptr中那5個數字
ex. ptr = {5,3,4,6,8},那我s當中的number = 5,s當中的score={5,3,4,6,8}

  1. 想請問這樣子的題目在main function中呼叫的順序是不是score_init -> score_set -> score_free
  2. 在score_set中是不是也需要配置記憶體空間(因為score的關係
  3. 在score_init中想利用calloc實作,但使用calloc時要餵給他個數和空間大小,可是題目沒說要多少個個數,這樣我是將將他視為1嗎? 如果是的話這樣配置記憶體有什麼意義嗎?
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

2
JamesDoge
iT邦高手 1 級 ‧ 2023-03-12 11:59:42
最佳解答
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

typedef struct _sScore {
    uint8_t number; //下面score的數量
    uint8_t *score; //假設上面number=5,score就會有5個elements,score會介於0~9
} sScore;

sScore *score_init(void);
void score_free(sScore *);
int32_t score_set(sScore *s, char *ptr);

int main(void) {
    // 初始化
    sScore *s = score_init();

    // 設值
    char *ptr = "53468";
    score_set(s, ptr);

    // 釋放記憶體
    score_free(s);

    return 0;
}

sScore *score_init(void) {
    // 配置記憶體空間
    sScore *s = (sScore*) calloc(1, sizeof(sScore));

    if (s == NULL) {
        printf("Failed to allocate memory for sScore\n");
        return NULL;
    }

    // 將數量初始化為 0
    s->number = 0;

    // 將分數指標初始化為 NULL
    s->score = NULL;

    return s;
}

void score_free(sScore *s) {
    if (s == NULL) {
        return;
    }

    // 釋放分數指標的記憶體
    free(s->score);

    // 釋放 sScore 結構的記憶體
    free(s);
}

int32_t score_set(sScore *s, char *ptr) {
    if (s == NULL || ptr == NULL) {
        return -1;
    }

    int32_t count = 0;

    // 計算分數的數量
    while (*ptr != '\0') {
        count++;
        ptr++;
    }

    // 設定分數的數量
    s->number = count;

    // 釋放原本的分數指標
    free(s->score);

    // 配置新的分數指標
    s->score = (uint8_t*) calloc(s->number, sizeof(uint8_t));

    if (s->score == NULL) {
        printf("Failed to allocate memory for scores\n");
        return -1;
    }

    // 設定分數
    ptr -= count; // 將指標移到最前面
    for (int32_t i = 0; i < count; i++) {
        s->score[i] = *ptr - '0'; // 轉換成數字
        ptr++;
    }

    return count;
}

不好意思,感覺是我問題沒問好,可以再請你針對我重新問的問題回答嗎?

JamesDoge iT邦高手 1 級 ‧ 2023-03-12 15:06:23 檢舉

/images/emoticon/emoticon08.gif

現在發現這個感覺是用ChatGPT寫的

我要發表回答

立即登入回答