我编写了一个程序,其中一个函数将两个指针作为参数,并且该函数会更改指针的地址,所以当我在main函数中调用指针的值时,它会显示相同的旧值。
代码: -
#include <stdio.h>
void sample(int *d, int *m);
int main(){
int day=12,month=3;
int *d,*m;
d = &day;
m = &month;
printf("Day = %d \t MOnth = %d\n",*d,*m);
sample(d,m);
printf("Day = %d \t Month = %d\n",*d,*m);
}
void sample(int *d, int *m){
int month = 1;
int day = 30;
m = &month;
d = &day;
}
基于对stackoverflow上相同问题的回答,我甚至使用sample(&d,&m)
调用了这些函数,但这也无法正常工作。
我甚至尝试定义这样的函数: -
void sample(int *d,int *m){
int month = 1;
int day = 30;
*m = month;
*d = day;
}
但程序崩溃了。
答案 0 :(得分:1)
如果要将任何变量传递给函数,在此函数中更改它并返回其 new 值,则需要传递对它的引用({{ 3}}),而不是变量本身(passing-by-reference)。
特别是在您的情况下,如果您要更改d
和m
的地址,则需要传递对要更改的地址的引用。这意味着您的功能应该像这样修改:
void sample(int *d,int *m){
*m = 1;
*d = 30;
}
并相应地修改main
函数的正文:
int day=12, month=3;
sample(&day, &month);
但是,如果您坚持使用,则应进行以下修改:
void sample(int **d, int **m){
int month = 1;
int day = 30;
*m = &month;
*d = &day;
}
因此你应该改变这个函数的调用:
int day=12, month=3;
int *d, *m;
d = &day;
m = &month;
sample(d,m);
答案 1 :(得分:0)
在sample()
API中,您为指针分配了一些新值,这些值仅在示例API中有效,传递指针的目的是保留值需要更改的位置。因此,您不应该更改指针所指向的位置,只需更改位置中的值,如下所示。
void sample(int *d,int *m)
{
int month=1,day = 30;
*m = month;
*d = day;
}
答案 2 :(得分:0)
让我们看看你的功能在做什么:
void sample(int *d,int *m){ // take a temporary pointer arg
int month = 1; // create a temporary variable
m = &month; // assign the address of the temporary
// to the temporary pointer
}
一个函数需要两个指针作为参数,该函数会改变指针的地址
如果你真的想要,那么:
您添加的示例:
void sample(int *d,int *m) {
int month = 1;
int day = 30;
*m = month;
*d = day;
}
没关系;就像在,它做的事情与第一个完全不同,但至少有机会工作。它崩溃的唯一方法是传递给它的值是坏的;所以问题在于呼叫者。
答案 3 :(得分:0)
更改函数的调用解决了问题
sample(&day,&month);
新守则: -
#include<stdio.h>
void sample(int *d,int *m);
int main(){
int day=12,month=3;
int *d,*m;
d = &day;
m = &month;
printf("Day = %d \t MOnth = %d\n",*d,*m);
sample(&day,&month);
printf("Day = %d \t Month = %d\n",*d,*m);
}
void sample(int *d,int *m){
int month = 1;
int day = 30;
*m = month;
*d = day;
}