C 指针作为返回值
如果我做了一个函数,对两个变量求和,并通过指针返回求和结果C 指针作为返回值,c,pointers,function-pointers,C,Pointers,Function Pointers,如果我做了一个函数,对两个变量求和,并通过指针返回求和结果 该算法可能会出现什么预期问题?如果结果在堆栈上(即在函数中本地声明),则指针将指向一个变量,该变量将在进行进一步函数调用后被覆盖 在某些情况下(即,立即从函数返回并在推送更多堆栈帧之前获取值),它可能会工作,但一般来说,这是错误的。如果结果在堆栈上(即,在函数中本地声明),然后指针将指向一个变量,一旦进行进一步的函数调用,该变量将被覆盖 在某些情况下(即,立即从函数返回并在推送更多堆栈帧之前获取值),它可能会工作,但一般来说,这是错误的
该算法可能会出现什么预期问题?如果结果在堆栈上(即在函数中本地声明),则指针将指向一个变量,该变量将在进行进一步函数调用后被覆盖
在某些情况下(即,立即从函数返回并在推送更多堆栈帧之前获取值),它可能会工作,但一般来说,这是错误的。如果结果在堆栈上(即,在函数中本地声明),然后指针将指向一个变量,一旦进行进一步的函数调用,该变量将被覆盖
在某些情况下(即,立即从函数返回并在推送更多堆栈帧之前获取值),它可能会工作,但一般来说,这是错误的。如果这样做,则没有问题:
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
}
另外,您还可以使用
malloc
,将结果(a+b
)存储在该内存中(通过将a+b
分配给*res
),然后返回该指针,但调用者需要释放该指针。这样做没有问题:
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
}
另外,您还可以使用malloc
,将结果(a+b
)存储在该内存中(通过将a+b
分配给*res
),然后返回该指针,但调用者需要释放它
预期的问题
- 未初始化的指针
问题:
指向“无处”pc
- 对齐错误的内存
问题:尽管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
堆栈上的add()
c
- 未初始化的指针
问题:
指向“无处”pc
- 对齐错误的内存
问题:尽管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
堆栈上的add()
c