0

我有一个结构和一个初始化函数,如下所示:

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;
}
4

3 回答 3

0

在您的代码中,该r字段是整数,而不是指向整数的指针!此外,&(p->b) 是指向整数( int**) 的指针。如果您希望 r 指向 b 数组中的整数,则需要像这样定义结构:

struct someStruct {
    int *b, *r;
}

并通过取消引用b ( ) 的元素int而不是指针本身 ( )来分配 r 指针int*

p->r = &(p->b[0]);

或者如果您想指向 b ,则根本不要取消引用b[0]

p->r = p->b;
于 2012-06-22T13:22:11.627 回答
0

自从我查看 C 以来已经有 15 天了,但我有一种奇怪的感觉,你的错误行应该看起来更像:

p->r = &(p->b);

不过,这只是一种预感。我现在没有时间测试。

这样就是说您将 b* 的地址存储到 p->r

但是对于指针,它们保存地址,而不是取消引用的值,所以你可以这样做

p->r = p->b;

除非您试图获取该点所在的地址,而不是指针指向的地址。

于 2012-06-22T13:23:01.663 回答
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]);

于 2012-06-22T19:27:49.283 回答