Munmap_chunck (): c中的无效指针



我写了一个程序来做一些数据分析,这些数据存储在一个名为p的全局结构中。我在一个函数中为这个结构分配了内存,然后,因为我需要整个程序使用它,所以直到main的最后才调用free。在main中没有调用Malloc,因为数组的大小是从文件中获得的,所以我认为读入文件并在那里分配内存是最有意义的,而不是在main中执行所有操作。

#include <stdlib.h>
#include <stdio.h>
typedef struct DATA
{
    /* variables*/
} DATA;
DATA *P;
void function1(void);
int main(int argc, char **argv)
{
    function1();
    /*do some stuff*/
    free(P);
    return 0;
}
void function1(void)
{
    if(!(P = (DATA *)malloc(nums * sizeof(DATA))))
    {
        printf("Error!n");
        exit(EXIT_FAILURE);
    }
    /*do stuff*/
}

实际上,当我运行我的代码时,我得到了错误:munmap_chunck():无效指针。我做了一些阅读,它似乎与函数free有关。我还读到malloc和free应该在同一个函数中调用。如果是这样的话,那么我的问题是:既然P是一个全局变量,为什么为这个特定的变量调用哪个函数malloc和free很重要?事实上,如果问题不是由在不同的函数中调用malloc和free引起的,有人有什么建议吗?非常感谢!

这是一个常见的问题,当您提供free一个指针,它不指向分配的内存块的开始。例如,代码

int* something = malloc(sizeof(int)); // Allocate space for 1 int
...
free(something);

将工作得很好,因为您正在为free提供malloc返回的原始指针。但是,如果您这样做:

int* something = malloc(sizeof(int) * 5); // Allocate space for 5 ints
...
something += sizeof(int); // Shift the allocated memory by 1 int
...
free(something);

那么free已经提供了一个指向分配的内存块中间某处的指针。这意味着本质上,free不知道块从哪里开始或结束,因此抛出一个错误。这可以通过将原始指针值存储在另一个指针中来解决:

int* something = malloc(sizeof(int) * 5);
int* another_something = something; // `another_something` contains the same pointer value as `something`
...
something += sizeof(int); // `something` changes, `another_something` doesn't
...
free(another_something); // Free the original pointer

那么,在你的例子中,像这样:

#include <stdlib.h>
#include <stdio.h>
typedef struct DATA
{
    /* variables*/
} DATA;
/* Declare another DATA*, P1 */
DATA *P, *P1;
void function1(void);
int main(int argc, char **argv)
{
    function1();
    /*do some stuff*/
    /* Free the original pointer, in P1 */
    free(P1);
    return 0;
}
void function1(void)
{
    if(!(P = (DATA *)malloc(nums * sizeof(DATA))))
    {
        printf("Error!n");
        exit(EXIT_FAILURE);
    }
    /* Store the original value of `P` in P1 */
    P1 = P;
    /*do stuff*/
}

最后,请修改您的命名约定。Pfunction1是很糟糕的名字

相关内容

  • 没有找到相关文章

最新更新