我写了一个程序来做一些数据分析,这些数据存储在一个名为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*/
}
最后,请修改您的命名约定。P
和function1
是很糟糕的名字