2013-04-21 56 views
0

所以我有一個不斷被新值覆蓋的數組。例如,這是輸出:我的數組正在被相同的值覆蓋?

instruc[0] = PRINTNUM 
instruc[1] = PRINTNUM 
instruc[2] = PRINTNUM 

其中PRINTNUM應該是陣列和前兩個元素中的最後一件事應該是別的東西。

這裏是我的特定區域代碼:

//array of instructions 
char** instruc = malloc(numLines * 200); 

c = fgets(inputString, 200, in_file); 

while (c != NULL){ 
    instruc[i]=inputString;  
    i++; 
    c = fgets(inputString, 200, in_file); 
} 

//print out what's in the array 
i=0; 
for (i=0; i<numLines; i++){ 
    printf("instruc[%d] = %s\n", i, instruc[i]); 
} 

提前感謝!

+0

你」不要爲字符串分配空間。 – Beta 2013-04-21 18:17:46

+0

爲了技術上的原因,他正在分配空間,只是不使用它,因爲他指向另一個字符串,而不是編輯:實際上你是對的 – 2013-04-21 18:19:00

+0

@ AK4749:不,他爲*指針分配空間*,而不是絃樂本身。 – Beta 2013-04-21 18:27:21

回答

1

沒有分配內存來存儲從文件讀入的行。是的,有內存分配但instruc類型char **和程序正在使用此內存,好像instrucchar *類型。

如果您希望存儲指向文件中所有記錄的指針,則必須分配它不僅用於將數據存儲在文件中,而且還需要存儲器來存儲指向每條記錄開頭的指針。

在這段代碼中,它出現的文件記錄長度固定爲200字節。 char **變量指向的指針數組並不是絕對必要的 - 只需將char *指針添加200字節即可指定從文件中讀取數據的開始,從而可以確定下一條記錄的開始。

爲指針存儲的每個記錄的東西開始像這樣將中無須:

char **fileRecPtrs = malloc(sizeof(char *) * numLines); 
char *instruc = malloc(200 * numLines); 
在循環

然後讀取文件級的每一條記錄:

c = fgets(instruc, 200, in_file);  
while (c != NULL) { 
    fileRecPtrs[i] = instruc; 
    instruc += 200; 
    i++; 
    c = fgets(instruc, 200, in_file); 
} 
1

您正在將數組中的每個索引指向相同的內存地址。我想你會更好使用strcpy

+0

如果我使用'strcpy(instruc [i],inputString)',我會遇到分段錯誤。 – user2253332 2013-04-21 18:18:51

+0

你需要爲每個索引分配空間 – Ken 2013-04-21 18:19:28

+0

嗯,我很新的C,所以我不知道你是什麼意思...我需要malloc inputString當我聲明它,或malloc每次我把東西在instruc [i]中? – user2253332 2013-04-21 18:23:29