c - 打开文件会导致 sYSMALLOc 断言失败

标签 c file pointers malloc valgrind

我已经为这个错误苦苦挣扎了一段时间,但我不知道出了什么问题。这是代码:

//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 数组还是 int 数组?如果它是一个int数组,你的malloc是错误的,它需要分配keyword_size * sizeof(int)字节

关于c - 打开文件会导致 sYSMALLOc 断言失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16889919/

相关文章:

将 32 位变量的类型更改为 64 位变量?

使用 execl 调用带有参数的 "ps"命令会出现意外行为

c - 将数组作为堆栈中的参数传递给 C

c# - 'System.Nullable<bool >' does not contain a definition for ' OK'

c++ - “void*”不是指向对象的指针类型

c++ - Opencv cv::findchessboardCorners

c# - 使用 File.SetCreationTime 和 File.SetLastWriteTime 使 Windows 资源管理器隐藏文件的这些详细信息

java - JBoss7/WildFly webapp - 如何从类访问属性文件

c - 根据用户输入决定动态分配多少内存

c++ - 使用 2 个 char[] 指针列表初始化一个 vector<string>