我有一个结构和初始化函数,如下所示:
struct someStruct {
int* b, r; // r is a pointer to an integer in b
};
someStruct* init_struct(size_t size) {
someStruct* p = (someStruct*) malloc(sizeof(someStruct));
p->b = (int*) malloc(size);
p->b[0] = 16;
p->r = &p->b; // Here's the error, why?
return p;
}
答案 0 :(得分:0)
在您的代码中,r
字段是一个整数,而不是指向整数的指针!此外,&(p-> b)是指向整数(int**
)的指针的指针。如果你想让r指向b数组中的整数,你需要像这样定义你的结构:
struct someStruct {
int *b, *r;
}
通过解除引用b(int
)的元素来分配r指针,而不是指针本身(int*
):
p->r = &(p->b[0]);
如果您想指向b[0]
:
p->r = p->b;
答案 1 :(得分:0)
自从我看了C之后已经过了15天,但我有这种奇怪的感觉,你的错误行看起来应该更像:
p->r = &(p->b);
虽然这只是一种预感。我没有时间在这一秒进行测试。
这就是说你将把b *的地址存储到p-> r
中但是使用指针,它们会保存地址,而不是取消引用的值,因此您可以执行
p->r = p->b;
除非您试图获取该点所在的地址,而不是指针指向的地址。
答案 2 :(得分:0)
int* b, r;
- 此语句表示b
是指向int变量的指针,r
是一个int变量。如果你想将r声明为int变量的指针,你必须遵循下面提到的任何一种方法。
第一路
int* b = NULL;
int* a = NULL;
第二路
int *b = NULL, *a = NULL;
第三种方式
typedef int* INT_POINTER;
INT_POINTER a = NULL, b = NULL;
请勿使用宏#define
代替typedef
最好的方法是使用typedef
,以避免混淆。
并且赋值语句应该与p->r = &(p->b[0]);