C 为什么我在下面的程序中得到了针对指针而不是数组的SEGFULT?

C 为什么我在下面的程序中得到了针对指针而不是数组的SEGFULT?,c,generic-programming,C,Generic Programming,一, 然后给出了分割错误 二, 然后它就可以正常工作了这两个代码片段都显示了 在这两个代码段中,您都会写入一个无效的内存位置来调用。当你这样做的时候,任何事情都可能发生。它不一定会发生故障或崩溃。它可能一次可以工作,但下次执行时会失败。这两个代码段都可能导致未定义的行为 第一个, int a[3]={1,2,3}; a[10]=10; 您已经为int a分配了内存,假设它有4个字节。然后“p”指向“a”的起始地址。当您使用“p++”时,由于“p”的类型为int*,它会按int的大小递增。“*p

一,

然后给出了分割错误

二,


然后它就可以正常工作了

这两个代码片段都显示了


在这两个代码段中,您都会写入一个无效的内存位置来调用。当你这样做的时候,任何事情都可能发生。它不一定会发生故障或崩溃。它可能一次可以工作,但下次执行时会失败。

这两个代码段都可能导致未定义的行为

第一个,

int a[3]={1,2,3};
a[10]=10;
您已经为int a分配了内存,假设它有4个字节。然后“p”指向“a”的起始地址。当您使用“p++”时,由于“p”的类型为int*,它会按int的大小递增。“*p”指向未分配的位置(地址+int的大小)。因此,它存在分段错误

假设int的大小是4,您的分配几乎是这样的(这里并没有考虑endianess)

| 0x00 | 0x00 | 0x00 | 0x03 |
执行p++时,p指向第一个字节


在第二种情况下,您很幸运,它没有给出seg错误。您只分配了(3*int大小)字节的内存,并试图访问未分配的[10]。它可能会给您一个分段错误,或者会返回任何垃圾值

即使它可以工作,如果你制作的数组大小为3,你如何分配[10]??这也是错误的,对此没有答案。两个程序的行为都未定义。因此,它们中的任何一个都可能出现分段错误,这取决于编译器、体系结构或其他因素。我知道在第一个指针中,它试图修改它不应该修改的地址,所以我在那里遇到分段错误,但在第二个示例中,我也在做同样的事情,那么为什么它工作正常?@ChiragGangdev似乎“工作正常”,但这也可能是一个错误。行为未定义。@ChiragGangdev:其行为未定义。去
int a[3]={1,2,3};
a[10]=10;
int a=3,*p=&a;
p++;
*p=10;
| 0x00 | 0x00 | 0x00 | 0x03 | <Not allocated> | <Not allocated>