[英]c - Access violation, unhandled exception when reading pointer array
將csv數據讀入緩沖區。 嘗試讀取緩沖區以將定界符更改為空字符,並在第350萬個字符后獲取訪問沖突。 文件中有超過1400萬個字符。 這是什么樣的伏都教吉普賽魔術??
void getCurrentData(FILE *current){
int totalProducts = 0, totalChars = 0, colCount = 0,
next = '\0', ch = '\0', productCount = 0;
long *buffer = NULL;
long i = 0;
fseek(current, 0, SEEK_END);
long fileSize = ftell(current);
rewind(current);
buffer = malloc(fileSize + 1);
fread(buffer, fileSize, 1, current);
/*replacing delimiter with null character*/
while (ch != EOF){
if (ch == ',' && next != ' '){
buffer[i - 1] = '\0';
}
ch = next;
if (next != EOF){
next = (int)(buffer)[i]; /*i was violated here*/
i++;
}
}
}
您的fread
正在寫入多頭緩沖; 因此,您只希望寫入350萬(= 1400萬/ sizeof(long))個項目; 但是您正在訪問緩沖區,就好像您希望它是一個字符數組一樣。 訪問3.5+百萬個項目將走到數組的末尾,因為您已將其分配為1400萬字節,而不是1400萬個條目。
另外, fread
永遠不會將EOF放入它寫入緩沖區的結果中。 它不變地寫出文件的內容。 您必須查看fread
的返回值以查看實際讀取了多少。
如果訪問沖突為i = 3500000
而不是3,500,000
字符,則此錯誤位於long
緩沖區的末尾。
由於您不知道,如果任何字符形成一個長 -1值,則可以輕松地超出分配的緩沖區。
因為您正在讀取chars變量緩沖區,所以它必須是char或unsigned char,不是嗎? 在這條線上
next = (int)(buffer)[i]; /*i was violated here*/
取決於您所使用的計算機,由於緩沖區變量的類型為long,因此您要在32位計算機中訪問4個字節/字符,在64位計算機中訪問8個字節/字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.