在函数返回后尝试打印结构变量的值时,它会打印一些随机文本(我认为这是由于内存分配错误)
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char s1[20];
char s2[20];
int n1;
} TEST;
void allocate(TEST *T, int n){
T = malloc(sizeof(TEST)*n);
for(int i=0; i<n; i++){
sprintf((T+i)->s1, "string 1 of %d", i);
sprintf((T+i)->s2, "string 2 of %d", i);
(T+i)->n1 = i;
}
}
int main(){
TEST *T;
int n = 3;
allocate(T, n);
for(int i=0; i<n; i++){
printf("%s\n%s\n%d\n\n", (T+i)->s1, (T+i)->s2, (T+i)->n1);
}
}
答案 0 :(得分:2)
不,C绝对不会自动为您调用free
。
程序中的问题是,T
的调用方中的allocate
未被更改。 C严格来说是一种“按值传递”的语言。
一种解决方案是在TEST**
中将T的类型更改为allocate
:
void allocate(TEST **T, int n){
使用
allocate(&T, n);
在main
中。然后,您在free
中呼叫main
。
答案 1 :(得分:1)
程序通过将未初始化的T
传递给函数来导致未定义的行为。此外,您永远不会将新的指针值从函数返回到main
。
指向新内存的指针是函数的输出,而不是输入。因此,它应该是一个返回值,而不是参数。例如:
TEST* allocate(int n)
{
TEST* T = malloc(sizeof(TEST)*n);
// etc.
return T;
}
然后在主目录中:
TEST* T = allocate(n);
// ... use T ...
free(T);
答案 2 :(得分:0)
不,不是。您需要自己free()
malloc()
记忆。
您的程序照样会泄漏内存...但是对于此特定程序,这没什么大不了的,因为该进程死后该内存已释放。
答案 3 :(得分:0)
正如已经给出的答案所说,您需要调用mat-cell
来释放内存。
您要分配指向的内存区域,因此需要一个navigation.openDrawer();
:
free
答案 4 :(得分:0)
不。程序的问题是T由副本传递给分配,并且分配给已分配内存的地址已分配给该副本。要解决此问题,您可以使第一个分配参数** T,在main中传入T的地址,然后在指针中取消指向指向指针的指针并分配给它。