0

给定 C 中的指向数组的指针,我们能否为其分配足够的内存以存储额外的元素(超出指定的数组大小),然后使用 [] 运算符或指针算法安全地访问这些元素?

考虑这个例子:

int (*foo)[ 10 ]; //Declare pointer to array of ten ints
foo = malloc( sizeof( int ) * 20 ); //Allocate memory for TWENTY ints
(*foo)[ 15 ] = 100; //Access element in "extra" space via [] operator 
*( *foo + 16 ) = 200; //Access element in "extra" space via pointer arithmetic
printf( "%d\n", *( *foo + 15 ) ); //Prints 100
printf( "%d\n", (*foo)[ 16 ] ); //Prints 200

此代码编译良好并在 gcc 中产生正确的结果。但是,我不确定它是否会调用未定义的行为。

谢谢!

4

2 回答 2

2

您正在执行的操作会触发未定义的行为int,因为您正在读取/写入超出大小为 10的数组的边界。

访问此内存的正确方法是使用 2D 数组访问。所以代替这个:

(*foo)[15] = 100;

这相当于:

foo[0][15] = 100;

做这个:

foo[1][5] = 100;
于 2021-10-31T00:39:33.463 回答
0

我会以不同的方式分配它:

foo = malloc( sizeof( *foo ) * nrows );

它将分配具有 10 个 clomns 和nrowsrowas 的二维数组。

访问数组的最佳方法是使用索引

foo[row][column]
于 2021-10-31T01:20:32.833 回答