gpt4 book ai didi

c - munmap_chunk() : invalid pointer in c

转载 作者:行者123 更新时间:2023-11-30 17:13:43 27 4
gpt4 key购买 nike

我编写了一个程序来进行一些数据分析,该数据存储在一个名为 P 的全局结构中。我在一个函数中为该结构分配内存,然后,因为我需要它来处理整个函数程序中,直到 main 的最后才调用 free。 Malloc 没有在 main 中调用,因为数组的大小是从文件中获取的,所以我认为读取文件并在那里分配内存是最有意义的,而不是在 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);

将正常工作,因为您提供freemalloc返回的原始指针。但是,如果您执行以下操作:

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 不知道 block 在哪里开始或结束,因此会抛出错误。这可以通过将原始指针值存储在另一个指针中来解决:

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 都是糟糕的名字。

关于c - munmap_chunk() : invalid pointer in c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30630641/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com