2016-07-23 89 views
0

嗨,我的問題是,我分配給我的指針指向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; 
} 
+2

你的動態數組指針中的每個指針都是相同的值; 'hold []'數組的基地址。因此,讀入該數組的最後一件事將是重複報告的內容。這個問題每週有十幾個保守的重複,但它們並不重要,因爲*每個人*似乎都在他們的標題/正文中使用獨特的(通常很少相關的)措辭。 – WhozCraig

+0

感謝您的回覆,我真誠地花了大約三天的時間搜索並沒有遇到任何可以與我正在做的事情相關的答案 - 通常所討論的數組都是整數或雙精度。你能否建議我如何增加指針(或類似)來改變地址?對不起,我是一個笨蛋 –

+1

'void main(argc,argv)int argc; char * argv []; {... return(0);}'是最奇怪的。請使用'int main(int argc,char * argv []){... return 0;}'而不是(甚至是'return EXIT_SUCCESS;')。 –

回答

2
strcpy(hold,buf); 
    list[arrcnt] = hold; 

這裏你指定你的指針list[arrcnt]到陣列 hold,它的內容將是你把它裏面在年底的最後一件事的開端。

你想要的是有一個不同的char[]數組指向列表的每個元素。你可以這樣做:

list[arrcnt] = malloc(strlen(buf)+1); 
strcpy(list[arrcnt], buf]); 
+0

謝謝,這是非常好的,我確實有一個malloc表達式後最初realloc,但這給了我錯誤,我不明白,所以我大概犯了語法或邏輯的根本錯誤。 –

+1

@The_Saint您的realloc語句爲'list'中的新*指針*分配空間,但不會爲該指針指向的輸入字符分配空間。 –

+0

謝謝ASH在一個階段,我認爲它的工作原理是什麼,但是我看了很多網絡上的例子,似乎沒有這樣的工作方式,我認爲我所擁有的malloc不正確,而不是那裏的語法我寫了。 –