访问动态分配的元素和数组

时间:2017-02-28 02:13:34

标签: c arrays malloc dynamic-memory-allocation

typedef struct myArrays
{
int id;
}MyArray;

当我们像这样分配动态数组时:MyArray * myArray = malloc(10 * sizeof (myArray) );然后我们使用点(。)运算符来访问内存位置,如下所示:myArray[0].myVar,但是当我们创建单个元素MyArray * myArray = malloc( sizeof (myArray) )时;然后我们使用箭头( - >)来访问其成员,如myArray->myVar

  

在第一个数组分配的情况下,myArray = malloc(10 * sizeof   (myArray)),myArray [i]指向第i个元素。我们也在这里   应该使用箭头,同时引用其成员   (myArray的[I] - > myVar的)。

我知道(myArray [i] - > myVar)错了,但请在概念上解释为什么会出错?

2 个答案:

答案 0 :(得分:2)

如你所说,如果你有一个声明

struct A
{
    int x;
} *a = malloc( sizeof( struct A ) ); 

然后你可以写例如

a->x = 10;

( a + 0 )->x = 10;

相同
( *a ).x = 10;

( *( a + 0 ) ).x = 10;

相同
a[0].x = 10;

您可以将指向单个对象的指针视为指向仅包含一个元素的数组的第一个元素的指针。

如果您有像

这样的结构数组
struct A
{
    int x;
} *a = malloc( 10 * sizeof( struct A ) ); 

你可以写例如

int i = 5;

( a + i )->x = 10;

相同
( *( a + i ) ).x = 10;

相同
a[i].x = 10;

带有下标运算符的后缀表达式返回指向对象的左值。

来自C标准(6.5.2.1数组下标)

  

2 post fi x表达式后跟方括号[]中的表达式   是数组对象元素的下标。该   下标运算符[]的定义是E1 [E2]与...相同   (*((E1)+(E2)))。由于适用于的转换规则   binary +运算符,如果E1是数组对象(等效于指针   到数组对象的初始元素),E2是一个整数,   E1 [E2]表示E1的第E2个元素(从零开始计数)。

因此你甚至可以写

0[a].x = 10;

例如

#include <stdio.h>
#include <stdlib.h>

int main( void ) 
{
    struct A
    {
        int x;
    } *a = malloc( sizeof( struct A ) ); 

    0[a].x = 10;

    printf( "a->x = %d\n", a->x );

    free( a );

    return 0;
}

答案 1 :(得分:0)

我有理由。如果是数组:myArray[i].myVar表示*(myArray + i).myVar,而在元素情况下:myArray->myVar也表示(*myArray).myVar。所以基本上我也可以使用&#34; (*myArray).myVar&#34;取代myArray->myVar。我也可以使用(myArray + i)->myVar代替myArray[i].myVar

简介:

  

myArray [i] .myVar ==(*(myArray + i))。myVar ==(myArray + i) - &gt; myVar

  

myArray-&gt; myVar ==(* myArray).myVar