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

ilmyapht  于 2023-02-21  发布在  其他
关注(0)|答案(1)|浏览(96)
    • 此问题在此处已有答案**:

(9个答案)
Difference between uninitialized and null pointer(6个答案)
5小时前关门了。
我正在尝试使用这段看似简单的代码来使用指针:

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

但是,我的终端没有任何输出。
就像程序卡在我的函数里,没有程序从函数里出来的迹象,甚至打印一个简单的"测试"

djmepvbi

djmepvbi1#

您将未初始化的指针作为参数传递给函数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;
}
  • 事实上,仅仅传递未初始化指针的值具有未定义的行为,但是试图解引用它们更可能导致诸如分段错误的可见效果。

相关问题