为什么我在下面的程序中获取Segfault而不是数组?

时间:2015-06-12 06:10:06

标签: c generic-programming

1

int a=3,*p=&a;
p++;
*p=10;

然后它给出了分段错误。

2

int a[3]={1,2,3};
a[10]=10;

然后它正常工作

2 个答案:

答案 0 :(得分:5)

两个代码段均显示Undefined Behavior

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

答案 1 :(得分:2)

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

对于第一个,

var rx = new Regex(@"(?<!\([^)]*)\s+(?![^(]*\))");
var txt = @"YOUR TEXT";
var reslt = rx.Split(txt);

您已为int a分配内存,假设其为4个字节。然后'p'指向'a'的起始地址。当你执行'p ++'时,因为'p'是int *类型,所以它的大小增加为int。 '* p'指向未分配的位置(int大小的地址)。因此它会出现分段错误。

假设int的大小为4,那么你的分配几乎就是这样(这里没有考虑endianess)。

int a=3,*p=&a;
p++;
*p=10;

当你做p ++时,p指向第一个字节。

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