为什么这个C指针代码不起作用?

时间:2011-10-12 22:34:00

标签: c pointers

在这里完成C newb。试图通过弄乱简单的代码片段来学习/理解指针。

#include <stdio.h>

void swap(int *px, int *py)
{
    int tmp;
    tmp = *px;
    *px = *py;
    *py = tmp;
}

main()
{
    int *a, *b;
    *a = 1;
    *b = 2;
    swap(&a,&b);
    printf("%d %d\n", *a, *b);
}

为什么这不起作用?从main中删除解除引用运算符*时,代码有效。

从概念上讲,这似乎应该有效。我将ab初始化为指针,分别指向int 1int 2。然后我将他们的地址发送到swap(),这应该切换他们指向的地址。

6 个答案:

答案 0 :(得分:11)

有几个问题。首先,指针ab未指向有效内存。因此,未定义整数值的赋值(可能崩溃)。其次,调用swap(假设a和b指向有效内存)不应该包含地址(它当前正在发送指针变量的地址)。

以下更改将使其有效:

int a, b;
a = 1;
b = 2;
swap(&a,&b);
printf("%d %d\n", a, b);

答案 1 :(得分:6)

swap()函数没问题,但在main中您正在获取指针的地址,因此您将int**个参数传递给int*个参数。< / p>

int *a, *b;
swap(&a,&b);

要解决此问题,请将main()中的代码替换为:

int a = 1, b = 2;
swap(&a,&b);
printf("%d %d\n", a, b);

答案 2 :(得分:4)

指针指向数据。指针本身不包含用于存储的存储器,它仅指向现有存储器。因此,当您声明int *a;时,您只有一个没有可用值的垃圾指针,并且您不能取消引用它。

使用指针的唯一合理方法是为它们分配某些地址(或某些分配函数的结果):

int i;
int *a = &i;  // now a points to i

因此,使用交换函数的正确方法是传递整数地址:

int i = 10;
int j = -2;

swap(&i, &j);

答案 3 :(得分:2)

ab是未初始化的指针,取消引用它们会导致未定义的行为。你想要:

int main() {
    int a, b;
    a = 1;
    b = 2;
    swap(&a,&b);
    printf("%d %d\n", a, b);
    return 0;
}

答案 4 :(得分:0)

您的方法签名错误。你要求两个指向int的指针,但你传递两个指向int的指针。

答案 5 :(得分:0)

当你说,“然后我将他们的地址发送到swap(),这应该切换他们指向的地址。”您是否尝试更改main中指针变量中的地址值,以切换它们指向的内存位?在这种情况下,您将需要另一个重定向步骤:

#include <stdio.h>

void swap(int **px, int **py) {
  int *tmp;
  tmp = *px;
  *px = *py;
  *py = tmp;
}

int main (void) {
  int x, y; /* storage to point to */
  int *a, *b;

  a = &x;
  b = &y;

  *a = 1;
  *b = 2;

  printf("(*a, *b, x, y) == (%d, %d, %d, %d)\n", *a, *b, x, y);
  swap(&a, &b);
  printf("(*a, *b, x, y) == (%d, %d, %d, %d)\n", *a, *b, x, y);
}

$ ./a.out
(*a, *b, x, y) == (1, 2, 1, 2)
(*a, *b, x, y) == (2, 1, 1, 2)

x&amp; y值未发生变化,但a指向x,现在指向y,反之亦然b