1
我一直在努力與這個bug一段時間,我無法弄清楚什麼是錯的。下面的代碼:打開一個文件給sYSMALLOc斷言失敗
//the code for the function that is being called
//charset is a const char[] consisting of 91 characters
//charset_size is 91
void set_sequence(char keyword[], int keyword_size){
sequence = malloc(keyword_size);
int i = 0, j = 0;
for(i = 0; i < keyword_size; i++){
for(j = 0; j < charset_size; j++){
if(keyword[i] == charset[j]){
sequence[i] = j;
}
}
}
sequence_size = keyword_size;
}
//the function call in main
set_sequence("foo bar\n", 8);
//there's supposed to be stuff done here with sequence that I haven't implemented yet
free(sequence); //sequence is a global variable that I use the function to set
FILE* dest = fopen("cipher", "w");
我包括在該文件位是因爲它的存在,我得到的斷言失敗,但是當它註釋掉的代碼運行的精絕的原因(我沒有這條線之後,因爲我是試圖找出問題)。
我通過valgrind的memcheck valgrind --tool=memcheck ../bin/cipher
運行代碼,看看問題是什麼,但我無法理解它。這裏的輸出:
==10608== Memcheck, a memory error detector
==10608== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==10608== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==10608== Command: ../bin/cipher -e testfile
Program running in encrypt mode
Open source file: success
Allocate memory for raw_input: success
Read source file: success
Allocate memory for input: success
input set-> freeing raw_input
==10608== Invalid write of size 4
==10608== at 0x80486DC: set_sequence (in /home/hugo/Programming/C++/Cipher
==10608== by 0x8048A86: main (in /home/hugo/Programming/C++/Cipher/bin/cipher)
==10608== Address 0x41f6688 is 0 bytes inside a block of size 8 alloc'd
==10608== at 0x402BB7A: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==10608== by 0x804868C: set_sequence (in /home/hugo/Programming/C++/Cipher/bin/cipher
==10608== by 0x8048A86: main (in /home/hugo/Programming/C++/Cipher/bin/cipher)
==10608==
==10608== HEAP SUMMARY:
==10608== in use at exit: 704 bytes in 2 blocks
==10608== total heap usage: 6 allocs, 4 frees, 1,793 bytes allocated
==10608==
==10608== LEAK SUMMARY:
==10608== definitely lost: 0 bytes in 0 blocks
==10608== indirectly lost: 0 bytes in 0 blocks
==10608== possibly lost: 0 bytes in 0 blocks
==10608== still reachable: 704 bytes in 2 blocks
==10608== suppressed: 0 bytes in 0 blocks
==10608== Rerun with --leak-check=full to see details of leaked memory
==10608==
==10608== For counts of detected and suppressed errors, rerun with: -v
==10608== ERROR SUMMARY: 2 errors from 1 contexts (suppressed: 0 from 0)
對不起,我花了一段時間纔得到你的答案。我一直很忙。您的解決方案奏效我完全忘了'char'是1個字節,而'int'是4個字節,所以當然這是一種糟糕的做法,直到我嘗試對'int'進行同樣的操作時纔會被忽視。 – Hugo