struct指针作为返回类型

时间:2017-10-26 15:22:28

标签: c pointers struct

我想打印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;
}

1 个答案:

答案 0 :(得分:1)

  

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为真,使函数return 2

  

int k = sizeof(kk)/ sizeof(kk [0]);得到0.我期待得到5。

您显然希望sizeof kk给出为kk分配的内存总量。

实际上,这就是你得到的intarr_t *的总内存量,这是kk的类型。这很可能导致4或8,具体取决于您的架构。什么是len * sizeof(int)在您拨打intarr_create()时产生的结果。正如@BoPersson评论的那样,如果你自己分配内存,你必须记住自己分配的内容。

sizeof kk / sizeof kk[0]“技巧”仅在kk 实际上是数组时才有效,即如果已使用{{1}在您的范围内声明它运算符就可以了,所以编译器可以“看到”它的大小。

因此,您的结构sizeof中有intint *,它们很可能需要比kk[0]更多的内存,整数除法结果为intarr_t *

您可能还注意到0不是递归的。使用free(),您将泄漏为所有free(kk)成员分配的所有内存。对于每个data,都需要有一个对应的 malloc()。 (即使程序在该free()之后结束,确实也很重要,因为并非所有操作系统都可以/将保护您免受此错误的影响。)