子函数返回值问题--临时变量&非临时变量

时间:2022-06-08 02:21:54

// 子函数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内存中了,没有什么临时变量之说.

#2


更正一下,是eax寄存器

  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则不会出问题。。。拿到地址,即使在函数内部申请的资源,你在函数外部依然可以释放。。

#4


char *func(void)
{
    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分配的内存空间首地址丢失, 
    无法正常访问到,导致这片堆空间丢失,从而出现内存泄露

#6


c 语言 函数间传递参数的本质都是by value, 关键是这个value 代表的是一个数值,还是一个变量的地址

#1


不知道,你所说的临时变量所谓何物?
如何返回的是内置类型如int char,指针类型等,返回时直接就放在eax内存中了,没有什么临时变量之说.

#2


更正一下,是eax寄存器

  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则不会出问题。。。拿到地址,即使在函数内部申请的资源,你在函数外部依然可以释放。。

#4


char *func(void)
{
    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分配的内存空间首地址丢失, 
    无法正常访问到,导致这片堆空间丢失,从而出现内存泄露

#6


c 语言 函数间传递参数的本质都是by value, 关键是这个value 代表的是一个数值,还是一个变量的地址