C和C++中未定义,未指定和实现定义的行为有什么区别?
c c++ undefined-behavior unspecified-behavior implementation-defined-behavior
众所周知,如果你像arr[i]
在C中那样访问数组元素,你也可以访问元素i[arr]
,因为这些只是归结为*(arr + i)
并且加法是可交换的.我的问题是为什么这适用于大于的数据类型char
,因为sizeof(char)
是1,而对我来说,这应该只用一个char来推进指针.
也许这个例子让它更清晰:
#include <string.h>
#include <stdio.h>
struct large { char data[1024]; };
int main( int argc, char * argv[] )
{
struct large arr[4];
memset( arr, 0, sizeof( arr ) );
printf( "%lu\n", sizeof( arr ) ); // prints 4096
strcpy( arr[0].data, "should not be accessed (and is not)" );
strcpy( arr[1].data, "Hello world!" );
printf( "%s, %s, %s\n", arr[1].data, 1[arr].data, (*(arr+1)).data );
// prints Hello world!, Hello …
Run Code Online (Sandbox Code Playgroud) 可能重复:
有关指针增量的问题
当我增加一个int指针时,它的地址有4个字节的间隙.为什么会这样?为什么int指针需要4个字节来存储而char需要2个字节?
我正在学习指针基础知识.请查看我的示例代码并告诉我发生了什么.
void main()
{
int i, *j;
i = 2;
j = i;
printf("%d", j);
printf("\n%d", j + 1);
printf("\n%d", j + 2);
}
Run Code Online (Sandbox Code Playgroud)
我的输出是
2 6 10
Run Code Online (Sandbox Code Playgroud)
请解释一下..