作为 return 值的指针
Pointers as a return value
如果我创建了对两个变量求和的函数,并且 return 通过指针求和结果。
该算法可能会发生哪些预期问题?
如果结果在堆栈上(即在您的函数中本地声明),则指针将指向一个变量,一旦进行进一步的函数调用,该变量将被覆盖。
它在某些情况下似乎可以工作(即立即从函数返回并在进一步堆栈帧被推送之前获取值)——但一般来说这是错误的。
如果你这样做没问题:
void sum(int a, int b, int *res)
{
*res = a+b;
}
例如调用:
int x;
sum(5, 6, &x);
但以下内容不正确:
int* sum(int a, int b)
{
int *res;
int x = a+b;
res = &x;
return res;// returning address of x - but x is not alive when function ends; don't do it
}
PS。您还可以使用 malloc
,将结果 (a+b
) 存储在该内存中(通过将 a+b
分配给 *res
),然后 return 该指针,但是那么调用者需要释放它。
the expected problems
未初始化的指针
void add(int a, int b, int * pc)
{
*pc = a + b;
}
int main(void)
{
int a = 1;
int b = 2;
int * pc;
add(a, b, pc);
...
问题:pc
分 "nowhere"。
内存对齐不当
void add(int a, int b, int * pc)
{
*pc = a + b;
}
int main(void)
{
int a = 1;
int b = 2;
char c[sizeof (int)];
add(a, b, c); /* or even add(a, b (int*) c); */
...
问题:虽然足够大,但 c
的内存可能无法正确对齐以容纳 int
。
内存无效
void add(int a, int b, int * pc)
{
int c = a + b;
pc = &c;
}
int main(void)
{
int a = 1;
int b = 2;
int * pc;
add(a, b, pc);
...
问题:从 add()
返回时,pc
指向无效内存,因为它已经被释放,即 c
位于 add()
的堆栈上。
如果我创建了对两个变量求和的函数,并且 return 通过指针求和结果。
该算法可能会发生哪些预期问题?
如果结果在堆栈上(即在您的函数中本地声明),则指针将指向一个变量,一旦进行进一步的函数调用,该变量将被覆盖。
它在某些情况下似乎可以工作(即立即从函数返回并在进一步堆栈帧被推送之前获取值)——但一般来说这是错误的。
如果你这样做没问题:
void sum(int a, int b, int *res)
{
*res = a+b;
}
例如调用:
int x;
sum(5, 6, &x);
但以下内容不正确:
int* sum(int a, int b)
{
int *res;
int x = a+b;
res = &x;
return res;// returning address of x - but x is not alive when function ends; don't do it
}
PS。您还可以使用 malloc
,将结果 (a+b
) 存储在该内存中(通过将 a+b
分配给 *res
),然后 return 该指针,但是那么调用者需要释放它。
the expected problems
未初始化的指针
void add(int a, int b, int * pc) { *pc = a + b; } int main(void) { int a = 1; int b = 2; int * pc; add(a, b, pc); ...
问题:
pc
分 "nowhere"。内存对齐不当
void add(int a, int b, int * pc) { *pc = a + b; } int main(void) { int a = 1; int b = 2; char c[sizeof (int)]; add(a, b, c); /* or even add(a, b (int*) c); */ ...
问题:虽然足够大,但
c
的内存可能无法正确对齐以容纳int
。内存无效
void add(int a, int b, int * pc) { int c = a + b; pc = &c; } int main(void) { int a = 1; int b = 2; int * pc; add(a, b, pc); ...
问题:从
add()
返回时,pc
指向无效内存,因为它已经被释放,即c
位于add()
的堆栈上。