[英]Multidimensional array in growing memory in C
這是我的代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
char ipaddr[20];
char filename[2048];
}iplog;
int main(){
unsigned long numrec=0;
iplog* e=(iplog*)calloc(1,sizeof(iplog)+1);
iplog* p=e;
memcpy(e->ipaddr,"127.0.0.1",20);
memcpy(e->filename,"/bla/bla/bla",2048);
e=(iplog*)realloc(e,sizeof(iplog)*(numrec++)+1); //memory not growing?
e++;
memcpy(e->ipaddr,"192.168.1.2",20);
memcpy(e->filename,"/abc/def/ghi",2048);
for (*p;p;p++){
printf("IP=%s, File=%s\n",p->ipaddr,p->filename);
}
free(e);
return 0;
}
我想要做的是在RAM中創建一個結構數組。 我不能使用格式array[n].element=value
因為我不知道我需要處理所有元素多少內存,因此我認為每次重新分配內存都是有好處的。 當我引入realloc時,會發生分段錯誤。
這是我的邏輯,糾正我犯錯的地方。 首先,我分配足夠的內存(via sizeof(iplog))
,再為空字符分配一個字節。 然后,我將數據發送到該結構的每個元素。 那里沒有問題。
我將原始分配的指針用於內存訪問,以便在realloc內部使用,因此我不使用自己的指針分配數百個新的內存塊。 第二個參數的值足以容納我需要的所有結構數據。 我使用numrec ++允許這樣做。
然后,我增加數據指針(通過e ++)以將數據寫入內存中的新空間。
最后,我使用第一次用於分配內存的原始指針來嘗試遍歷內存中的數據以進行打印,而我看到的輸出結果是打印的行數不正確,並帶有分段錯誤,如下所示:
IP=, File=
IP=, File=
...
...
IP=, File=
IP=, File=
Segmentation fault
我從上面的代碼中期望的是:
IP=127.0.0.1, File=/bla/bla/bla
IP=192.168.1.2, File=/abc/def/ghi
我究竟做錯了什么? 我假設它與realloc有關?
您的第一個問題是您使用numrec
。 當您調用realloc
, numrec
為0,並且您要進行后遞增,這意味着此處使用0。 您真正想要的是numrec
在重新numrec
之前為1(因為此時您確實有1條記錄),然后進行預遞增( ++numrec
),以便增量在被求值之前發生,並且應該以a結尾值2。
第二個問題是您在分配中分配了一個額外的字節。 當您進行指針算術運算時,這將使事情變得混亂。 當您執行e++
,它將使e
按結構的大小而不是按分配的大小前進。 這意味着您將在第二個結構之前結束1個字節。
最后一個問題是您的for循環。 您應該在這里使用numrec
來控制循環。 您現在擁有的方式是,無緣無故地評估*p
,然后循環執行直到p
等於說直到p != 0
,這不是您想要的。
線
e=(iplog*)realloc(e,sizeof(iplog)*(numrec++)+1);
等效於:
e=(iplog*)realloc(e,sizeof(iplog)*(numrec)+1);
numrec = numrec + 1;
由於numrec
已初始化為0
,因此實際上可以使用:
e=(iplog*)realloc(e,1);
那解釋了分割錯誤的問題。
將該行更改為:
// You need to be able hold 2 iplog objects.
numrec = 1;
e = realloc(e,sizeof(iplog)*(++numrec)); // No need of the extra +1
// No need of the explicit cast either.
閱讀所有注釋和答案后,我現在設法使代碼正常工作。 真正的問題是分配足夠的內存。 原來我在重新分配之前只分配了1個字節的內存。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
char ipaddr[20];
char filename[2048];
}iplog;
int main(){
unsigned long numrec=1,n=0;
iplog* op=(iplog*)calloc(1,sizeof(iplog)+1);
iplog* p,*e=op;
strcpy(e->ipaddr,"127.0.0.1\0");
strcpy(e->filename,"/bla/bla/bla\0");
op=(iplog*)realloc(op,sizeof(iplog)*(++numrec)+1); //memory not growing?
e=op;e+=(numrec-1);
strcpy(e->ipaddr,"192.168.333.444\0");
strcpy(e->filename,"/abc/def/ghi\0");
op=(iplog*)realloc(op,sizeof(iplog)*(++numrec)+1); //memory not growing?
p=op;e=op;e+=(numrec-1);
strcpy(e->ipaddr,"111.222.1.2\0");
strcpy(e->filename,"/abcc/defa/ghif\0");
for (n=0;n<numrec;n++){
printf("IP=%s, File=%s\n",p->ipaddr,p->filename);
p++;
}
free(op);
return 0;
}
看起來像是零長度數組的情況。 使用此數組,您可以在知道實際數組長度時分配所需的元素大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.