如何用指针交换项目

时间:2015-04-22 03:58:29

标签: c pointers

我正在编写一个小程序来帮助我更好地理解指针,以完成我正在进行的任务。

这是主要的

#include <stdio.h>

int main(int argc, char *argv[])
{

typedef struct some_t {
    int x;
} some_t; 

some_t *i, *j;

i->x = 1;
j->x = 2;

some_t *tmp;

tmp = i;
*i = *j;
*j = *tmp;

printf("i is %d\n", i->x);
printf("j is %d\n", j->x);

return 0;
}

一旦我运行它就会出现分段错误,我的emacs gud-gdb不会通过该程序运行。我启动它然后说“继续下一次休息。”#/ p>

我最终要做的是我有bag指向对象(武器,工具等)和equipment结构(配备的对象)。当我想装备bag中的一个对象时,我想翻转对象的指针。这样,equipment struct指向武器的指针,然后bag中的指针交换指向前一个对象的替换。

4 个答案:

答案 0 :(得分:1)

some_t *i, *j定义了两个指针,但它们并不指向任何有用的地方。它们是未初始化的变量

在这些定义之后,您尝试取消引用这些指针。因为他们没有指出任何有意义的事情,这会导致你的问题。在使用之前,请确保将指针指向

some_t a, b;
some_t *i, *j;
i = &a;
j = &b;

或类似的东西。

编辑说明:你的交换例程中有一堆额外的*;你只想交换指针,对吧?

tmp = i;
i = j;
j = tmp;

答案 1 :(得分:0)

您没有为指向的指针分配内存。如果没有这个,程序就不知道指针i和j指向的位置。 您需要先分配内存,然后让i和J指向它。

  

i=malloc(sizeof(some_t)); j=malloc(sizeof(some_t));

此外,您实际上并没有交换指针。您正在取消引用它们,并且基本上将数据从j指向的内存位置复制到i指向的内存位置。这没关系,但是当您在下一步中执行*j = *i时,基本上将相同的内容复制到已经存在的j所指向的内存中。

答案 2 :(得分:0)

您无法执行以下操作:

typedef struct some_t {
    int x;
} some_t; 

some_t *i, *j;

i->x = 1;
j->x = 2;

在这里,你有指针ij,它们没有指向任何有效的内存。 您需要分配足够的内存,然后将指针指向分配的内存,然后才能存储值。

typedef struct some_t {
    int x;
} some_t; 

some_t *i, *j;
i = malloc(sizeof(*i));
j = malloc(sizeof(*j));

i->x = 1;
j->x = 2;

答案 3 :(得分:0)

您不需要动态分配空间,但您需要分配空间。以下是静态分配空间的示例。它也有你交换指针(i和j)的变化,而不是交换解除引用的指针( i和 j):

#include <stdio.h>

int main(int argc, char *argv[])
{

typedef struct some_t {
    int x;
} some_t; 

some_t val1;
some_t val2;
some_t *i, *j;

i = &val1;
j = &val2;

i->x = 1;
j->x = 2;

some_t *tmp;

tmp = i;
i = j;
j = tmp;

printf("i is %d\n", i->x);
printf("j is %d\n", j->x);

return 0;
}