我正在编写一个小程序来帮助我更好地理解指针,以完成我正在进行的任务。
这是主要的
#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
中的指针交换指向前一个对象的替换。
答案 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;
在这里,你有指针i
和j
,它们没有指向任何有效的内存。
您需要分配足够的内存,然后将指针指向分配的内存,然后才能存储值。
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;
}