2017-06-14 38 views
-2

我的代码有另一个问题。我想用一个简单的指针用法访问所有3个值。但是我的指针跳得太远了。 我的输出是这样的:使用指针访问数组的两个结构

  1. 值为1

  2. 值是4194432

  3. 值是2686824

我想,我的问题是,我的指针来自错误的类型。所以,指针++不会跳转到下一个数组元素。我真的不知道,我怎么能解决这个问题。 (这只是一个简单的例子来重现我的问题,所以不要找感觉在做这个)

typedef struct _A { 
int value; 
}A; 

typedef struct _B { 
A array[10]; 
}B; 

int main() 
{ 
    A atest; 
    B btest; 
    B *p=NULL; 

    btest.array[0].value=1; 
    btest.array[1].value=3; 
    btest.array[2].value=5; 

    p=malloc(10 * sizeof(btest)); 
    p=&btest.array; 
    int i=0; 

    for(i=0;i<3;i++) 
    { 
     printf("\n%d. Value is %d\n",i+1,p++->array->value); 
    } 

    return 0; 
} 

THX阅读,如果事情是在我的解释失踪的话,我会道歉,并添加它。

编辑:

此外,以一些程序员多德Sollution,我添加了一个简单的铸件机械:

q=(A*) p; 
    q++; 
    p =(B*)q; 

THX对您有所帮助:)

+0

以undewrscore开头的名称保留用于所有名称空间的文件作用域实现!无论如何,像“A”这样的名字都是不合适的。 – Olaf

回答

1

这些线

p=malloc(10 * sizeof(btest)); 
p=&btest.array; 

包含两个问题。第一个是在第二个任务中你输了你分配的内存。它不复制btest.array的内容。

的第二个问题是,p是指向B&btest.array是指向十个A元件(其类型是A (*)[10])的阵列。这两个是不同的类型。

如果你想btest复制到分配给p(这是一个指向 B结构是有点矫枉过正)内存做例如

p=malloc(sizeof *p); 
memcpy(p, &btest, sizeof *p); 

然后到下一个问题

p++->array->value 

p++将使p指向下一个元素的数组指向p,但这是错误的。您应该循环播放p->array,而不是像

p->array[i].value 
+0

Thx为您的帮助和解释工作,一些程序员哥们。即使你有所改善,我的结果也是错误的。我知道,我的数组的类型是A,但是因为它指向B,我感到恼火。我尝试在它增加之前使用一个强制转换,然后在它之后重新转换。 –

+0

随着你的改进和一点点投我的问题就解决了:) thx一些程序员老兄! –