簡體   English   中英

struct指針作為返回類型

[英]struct pointer as return type

我想打印kk[i].data[j]但根本不打印。

intarr_save_binary返回2。我希望得到0。

int k = sizeof(kk) / sizeof(kk[0]); 給出0。我期望得到5。

我是否正確分配了內存?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {

    int len;
    int *data;

}intarr_t;

#define MAX 5

intarr_t* intarr_create(unsigned int len) {

    intarr_t* new_intarr = (intarr_t*)malloc(sizeof(intarr_t));
    if (!new_intarr) return NULL;

    new_intarr->data = (int*)malloc(len * sizeof(int));
    new_intarr->len = len;
    return new_intarr;

}
int intarr_save_binary(intarr_t* ia, const char* filename) {

    if (!ia) return 1;
    if (!ia->data) return 2;

    FILE* f = fopen(filename, "w");
    if (!f) return 3;

    if (fwrite(&ia->len, sizeof(ia->len), 1, f) == 1) {
        fprintf(f, "%d ", ia->len);
    }
    else {
        return 4;
    }

    if (fwrite(ia->data, sizeof(ia->data), ia->len, f) == ia->len) {
        fclose(f);
        return 0;
    }
    else {
        fclose(f);
        return 5;
    }
}
int main() {

    intarr_t *ia = (intarr_t*)malloc(MAX*sizeof(intarr_t));

    int i;
    int j;
    for (j = 0; j < MAX; j++) {

        ia[j].len = j + 1;

    }

    for (j = 0; j < MAX; j++) {

        ia[j].data = (int*)malloc(ia[j].len * sizeof(int));

    }

    for (j = 0; j < MAX; j++) {
        for (i = 0; i < ia[j].len; i++) {

            ia[j].data = (i + 1) * j;

        }
    }

    char name[20] = "myfile.txt";
    int d;

    printf("%d \n", intarr_save_binary(ia, name));


    intarr_t *kk;
    kk = intarr_create(MAX);


    int k = sizeof(kk) / sizeof(kk[0]);
    printf("%d\n",k);

    for (j = 0; j < k; j++) {
        for (i = 0; i < kk[j].len; i++) {

            printf("%d: %d\n", i, kk[j].data[i]);

        }
        printf("\n");
    }
    free(kk);
    return 0;
}

intarr_save_binary返回2。我希望得到0。

for (j = 0; j < MAX; j++) {
    for (i = 0; i < ia[j].len; i++) {

        ia[j].data = (i + 1) * j;

    }
}

第一次通過雙循環時,會將ia[0].data歸零。 ia[0].data = (0 + 1) * 0給出0 )。

因此, ia->data0!ia->data為true,使函數return 2


int k = sizeof(kk)/ sizeof(kk [0]); 給出0。我期望得到5。

您顯然希望sizeof kk給出分配給kk的內存總量。

實際上,這就是您所獲得的-為intarr_t *分配的內存intarr_t * ,這是此時的kk類型。 根據您的體系結構,最有可能導致4或8。 不是您調用intarr_create()len * sizeof(int)導致的結果。 正如@BoPersson所說,如果您自己分配內存,則必須記住自己分配了多少內存。

sizeof kk / sizeof kk[0] “技巧”僅在kk 實際上是一個數組時才有效,即,如果在您的范圍內使用sizeof運算符對其進行了聲明,以便編譯器可以“查看”其大小。

因此,由於您在結構kk[0]有一個int和一個int * ,它們與intarr_t *一起很可能需要更多的內存,因此整數除法會得出0


您可能還會注意到, free()不是遞歸的。 使用free(kk) ,您將泄漏為所有data成員分配的所有內存。 對於每個malloc() ,都需要有一個對應的 free() (而且即使在節目結束物權之后一個free()因為不是所有的操作系統都可以/將保護你從這個錯誤。)

暫無
暫無

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

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