簡體   English   中英

c-訪問沖突,讀取指針數組時出現未處理的異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM