嗨,我的問題是,我分配給我的指針指向while循環內的指針數組的值顯示OK在循環中,但循環後丟失例如讀取一個五個記錄文件(保持此測試簡稱)輸出以下內容 - 我顯然不理解這裏的基本內容,並在這裏和其他地方閱讀了許多幫助文章,但他們解決的問題在我看來並不相關。任何人都可以幫我嗎?我知道我沒有做適當的錯誤處理,我從一個更大的程序中剝離了這個代碼,儘可能地嘗試找出問題。指針指針和重新分配在C
Program debug output
list[0] = Test Record 1
list[1] = Test Record 2
list[2] = Test Record 3
list[3] = Test Record 4
list[4] = Test Record 5
In main list[0] = Test Record 5
In main list[1] = Test Record 5
In main list[2] = Test Record 5
In main list[3] = Test Record 5
In main list[4] = Test Record 5
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define RECLEN 500
FILE *infil;
char *input;
char *p1;
char buf[RECLEN];
char hold[RECLEN];
char **list;
int c;
long arrcnt;
int readin(void);
void main(argc,argv)
int argc;
char *argv[];
{
if(argc < 2)
{
printf("%s: No filename specified\n",argv[0]);
exit(1);
}
input = argv[1];
if((infil = fopen(input,"r")) == NULL)
{
printf("Error on opening file %s\n",input);
exit(1);
}
arrcnt=0;
readin();
while(feof(infil) == 0)
{
list = realloc(list, (arrcnt+1) * sizeof(char *));
strcpy(hold,buf);
list[arrcnt] = hold;
printf("list[%d] = %s",arrcnt,list[arrcnt]);
arrcnt++;
readin();
}
for (c = 0; c < 5;c++)
{
printf("In main list[%d] = %s",c,list[c]);
}
fclose(infil);
return (0);
}
int readin()
{
int j;
for(j=0;j<RECLEN;j++)
{
buf[j] = '\0';
}
fgets(buf,RECLEN,infil);
p1=buf;
return 0;
}
你的動態數組指針中的每個指針都是相同的值; 'hold []'數組的基地址。因此,讀入該數組的最後一件事將是重複報告的內容。這個問題每週有十幾個保守的重複,但它們並不重要,因爲*每個人*似乎都在他們的標題/正文中使用獨特的(通常很少相關的)措辭。 – WhozCraig
感謝您的回覆,我真誠地花了大約三天的時間搜索並沒有遇到任何可以與我正在做的事情相關的答案 - 通常所討論的數組都是整數或雙精度。你能否建議我如何增加指針(或類似)來改變地址?對不起,我是一個笨蛋 –
'void main(argc,argv)int argc; char * argv []; {... return(0);}'是最奇怪的。請使用'int main(int argc,char * argv []){... return 0;}'而不是(甚至是'return EXIT_SUCCESS;')。 –