在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( "%dn", *( *foo + 15 ) ); //Prints 100
printf( "%dn", (*foo)[ 16 ] ); //Prints 200
这段代码在gcc中可以很好地编译并产生正确的结果。但是,我不确定它是否调用了未定义行为。
谢谢!
你正在做的事情会触发未定义行为,因为你正在读取/写入超过大小为10的int
数组的边界。
访问该内存的正确方法是使用2D数组访问。所以不用这个:
(*foo)[15] = 100;
等于:
foo[0][15] = 100;
这样做:
foo[1][5] = 100;
我将以不同的方式分配它:
foo = malloc( sizeof( *foo ) * nrows );
它将分配具有10列和nrows
行的2D数组。
foo[row][column]