我想打印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;
}
答案 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->data
为0
,!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
中有int
和int *
,它们很可能需要比kk[0]
更多的内存,整数除法结果为intarr_t *
。
您可能还注意到0
不是递归的。使用free()
,您将泄漏为所有free(kk)
成员分配的所有内存。对于每个data
,都需要有一个对应的 malloc()
。 (即使程序在该free()
之后结束,确实也很重要,因为并非所有操作系统都可以/将保护您免受此错误的影响。)