简体   繁体   中英

Unexpected value by using printf (Call by reference in C)

#include <stdio.h>

int main()
{
int num1;
int *p;

p=&num1;

printf("Give a value\n");
scanf("%d", &num1);

printf("\n%d", num1);

f2(&num1);

printf("%d", *p);

return 0;
}

void f2(int *p)
{
    *p *= *p;
}

A call by reference program just to return the square of a value

Well, the problem is that if I do not use printf the expected output is correct (eg 2*2=4) However, if I include:

printf("\n%d", num1);

and run the programm I will take a non expected value (eg 2*2=24)

These two calls of printf result of outputting two values in the same line without a space.

printf("\n%d", num1);

f2(&num1);

printf("%d", *p);

If you want to make the output less confusing then for example write

printf("\n%d", num1);

f2(&num1);

printf("\n%d\n", *p);

There are two problems in your code.

  1. You need to declare void f2(int* p) before using it. Depending on your platform you might get away with it. But a sane compiler should give you at least a warning (which should be considered as an error).
  2. Sloppy format strings in your printfs make the output look wrong.

Try this:

#include <stdio.h>

void f2(int* p);   // you need to declare this, otherwise you'll get a
                   // warning you should always conside as an error    
int main()
{
  int num1;
  int* p;

  p = &num1;

  printf("Give a value\n");
  scanf("%d", &num1);

  printf("\nnum1 = %d\n", num1);   // format string more explicit

  f2(&num1);     // warnig here if f2 is not declared as above

  printf("*p = %d\n", *p);   // format string more explicit
  return 0;
}

void f2(int* p)
{
  *p *= *p;
}

There are several problems with this code.

  1. You need to either:

a. declare a prototype for f2. You can do this by putting the following code before your main

void f2(int *p);

b. put the entire f2 function before main (and this is the route that I'd probably choose - but questions of style are the cause of countless pointless wars.

  1. The output is unclear. By not putting \n in your printf statement you're running the output of the two print statements together. Use this instead:

printf("\n%d\n", num1);

  1. Pretty printing greatly improves readability. And don't be afraid of giving functions meaningful names.

On balance, I think I'd write your code like so:

#include <stdio.h>

void square(int *p) {
    *p *= *p;
}

int main(int argc, char *argv[]) {
    int num1;
    int *p;
    
    p = &num1;
    
    printf("Give a value: ");
    scanf("%d", &num1);
    
    printf("\n%d squared is equal to: ", num1);
    
    square(&num1);
    
    printf("%d\n", *p);
    
    return 0;
}

#include <stdio.h>
#include <math.h>

void f2 (int *p)
{
   *p = pow(*p, 2);  // equal with *p *= *p;
}

int main ()
{
  int num1;
  int *p;    // p is pointer variable that points to num1
             // type of num1 and p must be the same (int).

  p = &num1; // p is address of num1

  printf ("Give a value: ");
  scanf ("%d", p);  // p is address of num1

  printf ("\nnum1 before: %d", *p); // *p is num1 (content of p)

  f2 (p);

  printf ("\nnum1 after: %d", *p); // missing \n in here

  return 0;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM