我正在尝试这段看似简单的代码来使用指针:
#include <stdio.h>
void prod_and_sum(int a, int b, int *p, int *s) {
*p = a * b;
*s = a + b;
}
int main() {
int *p1, *p2;
prod_and_sum(5, 10, p1, p2);
printf("test");
return 0;
}
但是我的终端没有任何输出。
就像程序卡在我的函数里一样。没有迹象表明程序会从功能中走出来,甚至打印一个简单的“测试”
您将未初始化的指针作为参数传递给函数
prod_and_sum
。您的代码具有未定义的行为,因为函数 prod_and_sum
取消引用这些未初始化的指针以存储总和和乘积*。该程序可以停止或继续或产生其他副作用......在你的情况下,它似乎静静地停止了。
行为是未定义的,试图理解发生了什么是没有意义的......你应该通过传递你想要存储结果的
int
变量的地址来纠正问题:
#include <stdio.h>
void prod_and_sum(int a, int b, int *p, int *s) {
*p = a * b;
*s = a + b;
}
int main(void) {
int prod, sum;
prod_and_sum(5, 10, &prod, &sum);
printf("sum: %d, product: %d\n", sum, prod);
return 0;
}
请注意,您还可以通过使它们成为您返回的结构的字段来返回多个值:
#include <stdio.h>
typedef struct prod_sum { int prod, sum; } prod_sum;
prod_sum prod_and_sum(int a, int b) {
return (prod_sum){ a * b, a + b };
}
int main(void) {
prod_sum res = prod_and_sum(5, 10);
printf("sum: %d, product: %d\n", res.sum, res.prod);
return 0;
}
* 事实上,仅传递未初始化指针的值具有未定义的行为,但尝试取消引用它们更有可能导致可见的效果,例如分段错误。