[英]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->data
為0
, !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.