// 子函数1,这里返回的是临时变量,这样用好像没错。
int sum (int a, int b)
{
int c;
c = a + b;
return c;
}
//子函数2, 这里也是返回的临时变量,好像返回的用法不对。
char* aaitoa(int num)
{
union intch {
int a;
char p[10];
} temp;
temp.a = num;
return temp.p;
}
//子函数3,这样子函数返回的应该不是临时变量,这样用好像对了。
char *func(void)
{
char *p = (char*)malloc(sizeof(char) * 6);
strcpy(p, "Hello");
return p;
}
//子函数4, 这里p在栈里,但我觉着p指向了常量存储区,子函数返回的用法应该是对的。不过这里应该有内存泄露了吧?
char *func(void)
{
char *p = (char*)malloc(sizeof(char) * 6);
p = "Hello";
return p;
}
6 个解决方案
#1
不知道,你所说的临时变量所谓何物?
如何返回的是内置类型如int char,指针类型等,返回时直接就放在eax内存中了,没有什么临时变量之说.
如何返回的是内置类型如int char,指针类型等,返回时直接就放在eax内存中了,没有什么临时变量之说.
#2
更正一下,是eax寄存器
char *p = (char*)malloc(sizeof(char) * 6);
p = "Hello";
你这分配的空间没释放,当然有泄露了
char *p = (char*)malloc(sizeof(char) * 6);
p = "Hello";
你这分配的空间没释放,当然有泄露了
#3
//子函数2, 这里也是返回的临时变量,好像返回的用法不对。
char* aaitoa(int num)
{
union intch {
int a;
char p[10];
} temp;
temp.a = num;
return temp.p;
}
分配数据在 栈上,函数调用的过程,会吧数据保存在栈上,用完了,栈上的数据会被释放。。
//子函数3,这样子函数返回的应该不是临时变量,这样用好像对了。
char *func(void)
{
char *p = (char*)malloc(sizeof(char) * 6);
strcpy(p, "Hello");
return p;
}
//子函数4, 这里p在栈里,但我觉着p指向了常量存储区,子函数返回的用法应该是对的。不过这里应该有内存泄露了吧?
char *func(void)
{
char *p = (char*)malloc(sizeof(char) * 6);
p = "Hello";
return p;
}
malloc(c) new(c++)的数据的调用,会申请堆上的空间,系统会分配堆上的数据给调用者,直到你z主动调用申请free(对应malloc)\delete(对应new)释放申请的资源,系统才会释放掉资源,否则它会一直保持这个申请记录。
所以函数2的数据已释放,返回的char*会出错。。函数3,4则不会出问题。。。拿到地址,即使在函数内部申请的资源,你在函数外部依然可以释放。。
char* aaitoa(int num)
{
union intch {
int a;
char p[10];
} temp;
temp.a = num;
return temp.p;
}
分配数据在 栈上,函数调用的过程,会吧数据保存在栈上,用完了,栈上的数据会被释放。。
//子函数3,这样子函数返回的应该不是临时变量,这样用好像对了。
char *func(void)
{
char *p = (char*)malloc(sizeof(char) * 6);
strcpy(p, "Hello");
return p;
}
//子函数4, 这里p在栈里,但我觉着p指向了常量存储区,子函数返回的用法应该是对的。不过这里应该有内存泄露了吧?
char *func(void)
{
char *p = (char*)malloc(sizeof(char) * 6);
p = "Hello";
return p;
}
malloc(c) new(c++)的数据的调用,会申请堆上的空间,系统会分配堆上的数据给调用者,直到你z主动调用申请free(对应malloc)\delete(对应new)释放申请的资源,系统才会释放掉资源,否则它会一直保持这个申请记录。
所以函数2的数据已释放,返回的char*会出错。。函数3,4则不会出问题。。。拿到地址,即使在函数内部申请的资源,你在函数外部依然可以释放。。
#4
char *func(void)
{
char *p = (char*)malloc(sizeof(char) * 6);
p = "Hello";
return p;
}
char *p = func();
free(p),不会出问题的,关键是要记得,要释放。。。
{
char *p = (char*)malloc(sizeof(char) * 6);
p = "Hello";
return p;
}
char *p = func();
free(p),不会出问题的,关键是要记得,要释放。。。
#5
1 :没问题,返回一句数值而已!
2 :有问题,返回局部变量地址,当函数结束后,变量空间也是释放,所以数据丢失,
无法访问到有效数据(即使能访问到,可能是内存未擦除而已)
3 :分配堆内存,用户自己分配自己释放,拷贝"hello"的内容到空间上而已,地址未改变,
后面当不需要再使用的时候,直接free就好
4 :堆内存,后面 p = "hello"是把"hello"的首地址赋值给p,导致malloc分配的内存空间首地址丢失,
无法正常访问到,导致这片堆空间丢失,从而出现内存泄露
2 :有问题,返回局部变量地址,当函数结束后,变量空间也是释放,所以数据丢失,
无法访问到有效数据(即使能访问到,可能是内存未擦除而已)
3 :分配堆内存,用户自己分配自己释放,拷贝"hello"的内容到空间上而已,地址未改变,
后面当不需要再使用的时候,直接free就好
4 :堆内存,后面 p = "hello"是把"hello"的首地址赋值给p,导致malloc分配的内存空间首地址丢失,
无法正常访问到,导致这片堆空间丢失,从而出现内存泄露
#6
c 语言 函数间传递参数的本质都是by value, 关键是这个value 代表的是一个数值,还是一个变量的地址
#1
不知道,你所说的临时变量所谓何物?
如何返回的是内置类型如int char,指针类型等,返回时直接就放在eax内存中了,没有什么临时变量之说.
如何返回的是内置类型如int char,指针类型等,返回时直接就放在eax内存中了,没有什么临时变量之说.
#2
更正一下,是eax寄存器
char *p = (char*)malloc(sizeof(char) * 6);
p = "Hello";
你这分配的空间没释放,当然有泄露了
char *p = (char*)malloc(sizeof(char) * 6);
p = "Hello";
你这分配的空间没释放,当然有泄露了
#3
//子函数2, 这里也是返回的临时变量,好像返回的用法不对。
char* aaitoa(int num)
{
union intch {
int a;
char p[10];
} temp;
temp.a = num;
return temp.p;
}
分配数据在 栈上,函数调用的过程,会吧数据保存在栈上,用完了,栈上的数据会被释放。。
//子函数3,这样子函数返回的应该不是临时变量,这样用好像对了。
char *func(void)
{
char *p = (char*)malloc(sizeof(char) * 6);
strcpy(p, "Hello");
return p;
}
//子函数4, 这里p在栈里,但我觉着p指向了常量存储区,子函数返回的用法应该是对的。不过这里应该有内存泄露了吧?
char *func(void)
{
char *p = (char*)malloc(sizeof(char) * 6);
p = "Hello";
return p;
}
malloc(c) new(c++)的数据的调用,会申请堆上的空间,系统会分配堆上的数据给调用者,直到你z主动调用申请free(对应malloc)\delete(对应new)释放申请的资源,系统才会释放掉资源,否则它会一直保持这个申请记录。
所以函数2的数据已释放,返回的char*会出错。。函数3,4则不会出问题。。。拿到地址,即使在函数内部申请的资源,你在函数外部依然可以释放。。
char* aaitoa(int num)
{
union intch {
int a;
char p[10];
} temp;
temp.a = num;
return temp.p;
}
分配数据在 栈上,函数调用的过程,会吧数据保存在栈上,用完了,栈上的数据会被释放。。
//子函数3,这样子函数返回的应该不是临时变量,这样用好像对了。
char *func(void)
{
char *p = (char*)malloc(sizeof(char) * 6);
strcpy(p, "Hello");
return p;
}
//子函数4, 这里p在栈里,但我觉着p指向了常量存储区,子函数返回的用法应该是对的。不过这里应该有内存泄露了吧?
char *func(void)
{
char *p = (char*)malloc(sizeof(char) * 6);
p = "Hello";
return p;
}
malloc(c) new(c++)的数据的调用,会申请堆上的空间,系统会分配堆上的数据给调用者,直到你z主动调用申请free(对应malloc)\delete(对应new)释放申请的资源,系统才会释放掉资源,否则它会一直保持这个申请记录。
所以函数2的数据已释放,返回的char*会出错。。函数3,4则不会出问题。。。拿到地址,即使在函数内部申请的资源,你在函数外部依然可以释放。。
#4
char *func(void)
{
char *p = (char*)malloc(sizeof(char) * 6);
p = "Hello";
return p;
}
char *p = func();
free(p),不会出问题的,关键是要记得,要释放。。。
{
char *p = (char*)malloc(sizeof(char) * 6);
p = "Hello";
return p;
}
char *p = func();
free(p),不会出问题的,关键是要记得,要释放。。。
#5
1 :没问题,返回一句数值而已!
2 :有问题,返回局部变量地址,当函数结束后,变量空间也是释放,所以数据丢失,
无法访问到有效数据(即使能访问到,可能是内存未擦除而已)
3 :分配堆内存,用户自己分配自己释放,拷贝"hello"的内容到空间上而已,地址未改变,
后面当不需要再使用的时候,直接free就好
4 :堆内存,后面 p = "hello"是把"hello"的首地址赋值给p,导致malloc分配的内存空间首地址丢失,
无法正常访问到,导致这片堆空间丢失,从而出现内存泄露
2 :有问题,返回局部变量地址,当函数结束后,变量空间也是释放,所以数据丢失,
无法访问到有效数据(即使能访问到,可能是内存未擦除而已)
3 :分配堆内存,用户自己分配自己释放,拷贝"hello"的内容到空间上而已,地址未改变,
后面当不需要再使用的时候,直接free就好
4 :堆内存,后面 p = "hello"是把"hello"的首地址赋值给p,导致malloc分配的内存空间首地址丢失,
无法正常访问到,导致这片堆空间丢失,从而出现内存泄露
#6
c 语言 函数间传递参数的本质都是by value, 关键是这个value 代表的是一个数值,还是一个变量的地址