我创建了一个函数,它在C中执行欧几里德除法,并将商和余数作为函数参数。
代码清单1:
#include<stdio.h>
#include<stdlib.h>
void euclidean(int a, int b, int * q, int * r);
int main(int argc, char ** argv){
int * q;
int * r;
euclidean(5,4, q, r);
printf("q = %d, r = %d", *q, *r);
return 0;
}
void euclidean(int a, int b, int * q, int * r){
q = (int*)malloc(sizeof(int));
r = (int*)malloc(sizeof(int));
*q = a/b;
*r = a % b;
//printf("q = %d, r = %d", *q, *r); //this will show
return;
}
代码清单2:
#include<stdio.h>
#include<stdlib.h>
void euclidean(int a, int b, int * q, int * r);
int main(int argc, char ** argv){
int * q;
int * r;
euclidean(5,4, q, r);
printf("q = %d, r = %d", *q, *r);
return 0;
}
void euclidean(int a, int b, int * q, int * r)
{
*q = a / b;
*r = a % b;
//printf("q = %d, r = %d", *q, *r); //this won't show
return;
}
两个版本都无效。我在Windows上编译并运行代码,程序在运行时被终止而不打印任何内容(即“q = 1,r = 4”)。我的猜测是如果我必须在linux上编译并运行它,终端会给我一个“分段错误”错误(不确定)。我真的不明白为什么它不起作用,尤其是代码清单1 。对于代码清单2 ,人们可以争辩说,由于操作的结果是在创建它们的函数内部的某种常量变量,所以它们不能保留在函数的末尾(我需要对此的确认)。感谢
答案 0 :(得分:2)
保持简单,愚蠢(有这样的原则)。:)
#include<stdio.h>
#include<stdlib.h>
void euclidean(int a, int b, int * q, int * r);
int main(int argc, char ** argv){
int q;
int r;
euclidean(5,4, &q, &r);
printf("q = %d, r = %d", q, r);
return 0;
}
void euclidean(int a, int b, int * q, int * r)
{
*q = a / b;
*r = a % b;
}
如果您确实要在函数中分配内存,那么代码将类似于
#include<stdio.h>
#include<stdlib.h>
void euclidean(int a, int b, int * *q, int * *r);
int main(int argc, char ** argv){
int * q;
int * r;
euclidean(5,4, &q, &r);
printf("q = %d, r = %d", *q, *r);
free( q );
free( r );
return 0;
}
void euclidean(int a, int b, int * *q, int * *r){
*q = (int*)malloc(sizeof(int));
*r = (int*)malloc(sizeof(int));
**q = a/b;
**r = a % b;
}
答案 1 :(得分:1)
您想要的是传递引用,它允许被调用者修改调用者提供的对象。
由于C纯粹是按值传递,因此使用指针进行模拟:
调用者传递被调用者应修改的对象的地址,被调用者取消引用接收的指针以修改预期的目标。
#include<stdio.h>
#include<stdlib.h>
void euclidean(int a, int b, int * q, int * r)
{
// Modify the target-objects q and r point to
*q = a / b;
*r = a % b;
}
int main() {
int q, r; // Not pointers, the objects themselves!
euclidean(5, 4, &q, &r); // Passing the addresses of q and r
printf("q = %d, r = %d", q, r);
}
根本没有动态分配。
答案 2 :(得分:1)
您没有获得listing_2的值,因为: -
void euclidean(int a, int b, int * q, int * r)
{
*q = a / b; <<<<<<<<<<<<<<<<<
*r = a % b;
//printf("q = %d, r = %d", *q, *r); //this won't show
return;
}
你既没有为主,也没有在欧几里德为q,r分配内存。当您尝试将指针未初始化为任何东西时,您会收到错误。