简体   繁体   中英

C function with pointers work on one computer, and doesn't work on another

#include <stdio.h>
void swap (int *a, int *b)
 {
    int *tmp;
    *tmp = *a;
    *a = *b;
    *b = *tmp;
 }

int main ()
{
 int x = 5;
 int y = 7;
 swap (&x,&y);
 printf ("\n x = %d \n y = %d \n",x,y);
}

I'm using codeblocks, and this code won't work, and I don't understand why... On one computer it works perfectly but on the other it won't run at all. Any help? Thanks in advance.

int tmp;
tmp = *a;
*a = *b;
*b = tmp;

What you need is a variable tmp to store the value and not a pointer *tmp .

The below code really a poor way of doing this but

int *tmp = malloc(sizeof(int));

    *tmp = *a;
    *a = *b;
    *b = *tmp; 

Once done please free the memory using

free(tmp);

Gopi already corrected your code - adding on to the previous answer - i think this is good to know information for a newbie:

Section 4.1 states:

An lvalue (3.10) of a non-function, non-array type T can be converted to an rvalue. If T is an incomplete type, a program that necessitates this conversion is ill-formed. If the object to which the lvalue refers is not an object of type T and is not an object of a type derived from T, or if the object is uninitialized , a program that necessitates this conversion has undefined behavior . If T is a non-class type, the type of the rvalue is the cv-unqualified version of T. Otherwise, the type of the rvalue is T.

When you try to dereference and uninitialized pointer the behavior is undefined. Undefined means anything can happen - there is no guarantee. So you can get different behavior in different environments.

From Wiki Making pointers safer

A pointer which does not have any address assigned to it is called a wild pointer. Any attempt to use such uninitialized pointers can cause unexpected behavior, either because the initial value is not a valid address, or because using it may damage other parts of the program. The result is often a segmentation fault, storage violation or wild branch (if used as a function pointer or branch address).

What you did here:

int *tmp;
*tmp = *a;

is that you created a pointer to int which is not pointing to anything - basically it contains some junk value (could be your pincode even - who knows).

Your mistake was to use uninitialized memory. Always allocate memory to a pointer before using it. Next, don't forget to free the allocated memory after you're done with it.

Also, you should add return 0; at the end of your main() function.

If you don't mind a second opinion, check the below code.

#include <stdio.h>
#include <stdlib.h>

void swap (int *a, int *b)
{
        int *tmp = malloc(sizeof(*tmp));
        *tmp = *a;
        *a = *b;
        *b = *tmp;
        free(tmp);
}

int main ()
{
        int x = 5;
        int y = 7;
        swap (&x,&y);
        printf ("\n x = %d \n y = %d \n",x,y);
        return 0;
}

If you want to use pointers, although it does not make any sense at all

void swap(int *a, int *b)
{
    int tmp[1];

    *tmp = *a;
    *a   = *b;
    *b   = *tmp;
}

here tmp is not strictly a pointer, but you can use the * indirection operator on it.

Or

void swap(int *a, int *b)
{
    int value = *a;
    int *tmp  = &value;

    *tmp = *a;
    *a   = *b;
    *b   = *tmp;
}

Or you can use malloc as Gopi already pointed out.

If you want to use pointers, then do use pointers:

#include <stdio.h>

void swap (int ** ppx, int ** ppy)
 {
   int * p = *ppx;
   *ppx = *ppy;
   *ppy = p;
 }

int main (void)
{
  int x = 5;
  int y = 7;
  int * px = &x;
  int * py = &y;

  printf ("\nx = %d\ny = %d\n", *px, *py);

  swap (&px, &py);

  printf ("\nx = %d\ny = %d\n", *px, *py);

  return 0;
}

Result:

x = 5
y = 7

x = 7
y = 5

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