除了函数的参数顺序不同,为什么相同的函数会有不同的结果?
例如:
我的代码
#include <stdio.h>
#define MAX_SIZE 100
void sum2(float *list, int n);
void sum3(int n, float *list);
float input[MAX_SIZE];
int main(void){
printf(" sum2(input, MAX_SIZE) n");
sum2(input, MAX_SIZE);
printf(" sum3(MAX_SIZE, input) n");
sum3(MAX_SIZE, input);
}
void sum2(float *list, int n)
{
printf("&list t= %pnn", &list);
}
void sum3(int n, float *list){
printf("&list t= %pnn", &list);
}
sum2(input, MAX_SIZE)
&list = 0x16fc5b268
sum3(MAX_SIZE, input)
&list = 0x16fc5b260
预期
sum2(input, MAX_SIZE)
&list = 0x16fc5b268
sum3(MAX_SIZE, input)
&list = 0x16fc5b268
与上面的代码一样,除了参数的顺序外,其他结果都是从同一个函数输出的。
我试着找一个类似的问题,但是我找不到。我认为如果它是一个具有相同值的函数,那么无论参数的顺序如何,输出的值都应该是相同的。我的意见有错吗?
为您的信息,我的编译器是苹果clang版本14.0.0 (clang-1400.0.29.202)。
谢谢你的回答。
这是因为您打印的是局部变量list
的地址(引用),而不是静态存储持续时间数组input
的引用。参数如何传递给函数是由实现定义的,你不应该做任何假设。
如果你修改程序,你会看到不同之处:
#include <stdio.h>
#define MAX_SIZE 100
void sum2(float *list, int n);
void sum3(int n, float *list);
float input[MAX_SIZE];
int main(void){
printf(" sum2(input, MAX_SIZE) n");
sum2(input, MAX_SIZE);
printf(" sum3(MAX_SIZE, input) n");
sum3(MAX_SIZE, input);
}
void sum2(float *list, int n)
{
printf("address of list t= %pn", (void *)&list);
printf("address kept in list t= %pn", (void *)list);
printf("address of input t= %pnn", (void *)input);
}
void sum3(int n, float *list){
printf("address of list t= %pn", (void *)&list);
printf("address kept in list t= %pn", (void *)list);
printf("address of input t= %pn", (void *)input);
}
,输出为:
sum2(input, MAX_SIZE)
address of list = 0x7ffff4b9b178
address kept in list = 0x404060
address of input = 0x404060
sum3(MAX_SIZE, input)
address of list = 0x7ffff4b9b170
address kept in list = 0x404060
address of input = 0x404060