如何使用指针返回多个值 |我的输出在哪里?

问题描述 投票:0回答:1

我正在尝试这段看似简单的代码来使用指针:

#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;
}

但是我的终端没有任何输出。

就像程序卡在我的函数里一样。没有迹象表明程序会从功能中走出来,甚至打印一个简单的“测试”

c pointers
1个回答
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;
}

* 事实上,仅传递未初始化指针的值具有未定义的行为,但尝试取消引用它们更有可能导致可见的效果,例如分段错误。

© www.soinside.com 2019 - 2024. All rights reserved.