2017-06-12 72 views
-1

我必須在最後一行的錯誤,在nullString,功能設置的所有字符串「\ 0」用一個簡單的()Ç - 寫訪問衝突

void function (unsigned char inputArray[], size_t inputSize) 
{ 
    size_t cellSize; 
    if (inputSize <= 256) 
     cellSize = 1; 
    else 
     cellSize = ceil(inputSize/2/256) + 1; 


    // Sub Box 
    unsigned char subBox[255]; 
    for (size_t line = 0; line < 255; line++) 
     subBox[line] = 0; 

    generate_SubBox(subBox, key); 
    // Sub Box 


    // Sub Box reverse 
    unsigned char subBox_Inverse[255]; 
    for (size_t line = 0; line < 255; line++) 
     subBox_Inverse[line] = 0; 

    generate_SubBox_Inverse(subBox_Inverse, subBox, key); 
    // Sub Box reverse   

    unsigned char* inputArray2 = NULL; 
    inputArray2 = malloc(sizeof(unsigned char)* inputSize/2); 
    verifyMalloc(inputArray2); 
    nullString(inputArray2, inputSize/2); 

    unsigned char string_temp[3] = { 0 }; 
    size_t w = 0; 
    for (size_t i = 0; i < inputSize/2; i++) 
    { 
     string_temp[0] = inputArray[w]; 
     string_temp[1] = inputArray[w + 1]; 

     inputArray2[i] = strtoll(string_temp, NULL, 16); 

     w += 2; 
    } 
} 

我試圖中和每行線所有的指令都在nullString()之前通過註釋它們,但它不會改變任何東西。

如果我中和nullString,在錯誤出現之後,在

inputArray2[i] = strtoll(...)

希望你已經有了答案:)

提前感謝!

編輯: 這裏是nullString:

void nullString(unsigned char input[], size_t length) 
{ 
    for (size_t x = 0; x < length; x++) 
     input[x] = '\0'; 
} 

我nullString評論之前的所有指令,錯誤仍然存​​在。

我也驗證了變數,他們都看起來不錯

編輯2: verifyMalloc:

void verifyMalloc(int* pointer) 
{ 
    if (pointer == NULL) 
    { 
     perror("Erreur"); 

     Sleep(15000); 
     exit(0); 
    } 
} 
+1

可能你的問題是在'nullString()'或其他地方。你介意顯示這個功能嗎? – harper

+0

隔離失敗的想法:1)通過註釋失活所有與'inputArray2'不相關的代碼。如果失敗消失,請查找最後的更改。 2)使用調試器並在發生異常的位置之前驗證變量。 – harper

+0

如何發佈nullString?我必須編輯我的第一篇文章嗎? –

回答

0

一切都在你認真暗示忘記#include <stdlib.h>(而忽略從產生的警告)。

這是當你使用malloc()而不包括stdlib.h在同一文件中什麼可能發生的情況:

  • 編譯考慮隱式聲明的malloc()功能,這意味着它是假設它的返回類型爲int(而不是*void)。
  • 可能工作時sizeof (int)是相同的sizeof (*void)。但是,當int是32位而指針是64位時,則由malloc()返回的地址可能會丟失其一半位並指向無效地址。
0

嘗試使用

void bzero(void *s, size_t n); or 
void *memset(void *s, int c, size_t n); 

,而不是你nullString()和()東西[x] = 0循環。

那麼,這並沒有使所有的數組歸零:

unsigned char string_temp[3] = { 0 }; 

這使得

string[0] = 0; 
string[1] = god_knows; 
string[2] = god_knows_not; 

so either - unsigned char string_temp[3] = {0,0,0}; 
or bzero(string_temp,3); 

因此,當你這樣做:

string_temp[0] = inputArray[w]; 
string_temp[1] = inputArray[w + 1]; 

inputArray2[i] = strtoll(string_temp, NULL, 16); 

與strtoll()將猜測何時停止。不保證這將在string_temp [2]。

那麼,這應該是足夠了:

unsigned char* inputArray2 = malloc(sizeof(unsigned char) * inputSize/2); 

inputArray2將是NULL,如果malloc的失敗,還是一個有效的指針,如果它成功了。

你可能想檢查你的inputSize/this_and_that算術。它真的提供你所期望的嗎?您可能會對整數操作數的除法結果感到驚訝。

這也看起來很可疑:

inputArray2[i] = strtoll(string_temp, NULL, 16); 

與strtoll回報龍龍整數,但你的inputArray2是無符號的字符類型。所以,你想存儲8個字節(的sizeof LONGLONG = 8),你保留的地方只有一個(的sizeof字符= 1)

重新聲明你inputArray2只要長

long long *inputArray2 = malloc(sizeof(long long) * inputSize /2); 

並嘗試這與memset的( ):我們看到

size_t size = sizeof(long long) * inputSize/2; 
//Do you really need long long? You are storing max three digits. uint_8 will be enough 

long long* inputArray2 = malloc(size); 
memset(inputArray2, 0, size); 
+0

inputSize/2給我的確切值我除外,沒有問題,所以我離開inputArray2 = malloc(...),因爲它是 感謝string_temp [3] = {0},它現在string_temp [3] = {0,0,0} Memset(因爲我在Windows 10和Visual Studio中)沒有幫助,同樣的錯誤,但執行memset時。 我也檢查了malloc與if(... == NULL),沒問題,malloc是好的... –

+0

你現在從哪裏得到錯誤?在你正在使用的memset()中,而不是nullString();或者稍後,當你嘗試inputArray2 [i] = strtoll(); – Sokre

+0

錯誤是在memset()中,我不再使用nullString。如果我評論memset(),那麼錯誤發生在「inputArray2 [i] = strtoll(string_temp,NULL,16);」 –