这似乎工作的原因是因为您正在增加指针以指向内存中的新点(您的程序可能会或可能不会分配使用)。我猜你是在堆栈上声明这个,这就是为什么你的未定义行为看起来是“好的”。
我认为您不了解指针的功能和您使用的语法。注意以下是等价的:
int arr[ 2 ] = { 1, 2 };
int *pi = &arr;
// The following output is equivalent to...
for ( int i = 0; i < 2; i++ ) {
printf( "arr[i] = %d.\n", arr[ i ] );
}
// this.
for ( int i = 0; i < 2; i++ ) {
printf( "*(p + i) = %d.\n", *( p + i ) );
}
考虑一下这个代码的替代实现,以强调如何通过索引数组外部的元素来指向新的内存地址。
int *d = ( int * )malloc( 2 * sizeof( int ) );
*( d + 0 ) = 4; // Observe you are accessing the memory location d points to.
*( d + 1 ) = 5; // Observe you are accessing the memory location d + 4 bytes (or 8 if 64-bit) points to...
*( d + 2 ) = 8; // ...
*( d + 3 ) = 9; // ...
*( d + 4 ) = 7; // Observe you are assigning a value to the memory location of d + 24 bytes (or 48 bytes if 64-bit).
for ( int i = 0; i < 5; i++) {
printf( "%d \n", *( d + i ) );
}
只是对您的代码的快速说明。malloc 通常应该跟在一个 free 之后——所以适当地使用它,这样就不会出现内存泄漏。
我希望这有帮助!如果我犯了错误,请随时纠正我。