如果我创建了对两个变量求和的函数并通过指针返回求和结果。
该算法可能会出现什么问题?
答案 0 :(得分:2)
预期的问题
未初始化的指针
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
点"无处"。
内存严重错误
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()
。< / p>
答案 1 :(得分:1)
如果结果在堆栈上(即在函数中本地声明),那么指针将指向一个变量,一旦进一步调用函数,它将被覆盖。
它似乎可以在某些情况下工作(即,在推送更多堆栈帧之前立即从函数返回并获取值) - 但一般来说这是错误的/错误的。
答案 2 :(得分:1)
如果你这样做会没问题:
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
),然后返回该指针,但调用者将会需要释放它。