Can someone explain why the value of the variable test isn’t changed when I run the short code snippet below?
#include <stdio.h>
int f1(char * foo) {
*foo = 'a';
return 0;
}
void main(void) {
char test = 'n';
printf("f1(&test)=%d. test's new value? : %c", f1(&test), test);
}
I know I’m probably missing something really simple. I just don’t understand why test isn’t changed in f1() because I’m passing it’s address in, right? Why does it matter that the actual function call happens in the list of arguments to printf() ?
If I take the call to f1() out of the printf argument list like so:
#include <stdio.h>
int f1(char * foo) {
*foo = 'a';
return 0;
}
void main(void) {
char test='n';
int i;
i = f1(&test);
printf("f1(&test)=%d. test's new value? : %c", i, test);
}
things work as expected.
thanks in advance.
The order in which the arguments to a function call are evaluated is unspecified. Put another way, you can’t tell for sure when
f1(&test)will be evaluated.So in your example, perhaps
f1(&test)is evaluated aftertest: slightly counter-intuitively, you don’t get to see the side effects of that invocation. But if you printtestagain after the call, you will indeed see them.Bottom line, just be careful with function that have side-effects and you should be set.