【问题标题】:Will this result in a seg fault这会导致段错误吗
【发布时间】:2015-05-29 17:32:16
【问题描述】:

下面是我的代码:

p = (float *) malloc(sizeof(float) * n);
p1 = p; // p1 is float*
p--; // Will this result in a seg-fault?

我猜是的,因为我试图访问分配空间之外的内存。 请问有人可以确认吗?

编辑 看到霍布斯的回答后,我也忍不住问了这个。

我坚信这不会导致段错误

printf("%f",p[n]); // because n is legally allocated for p

【问题讨论】:

标签: c


【解决方案1】:

你根本没有访问任何内存;你在做指针算术。使用指针算法来获取不在对象内部或超出数组末尾的指针是未定义的行为,因此任何事情都可能发生,包括段错误。但是,在大多数合理的系统上,什么都不会发生,除非您尝试使用 *p 这样做。到那时,任何事情都可能发生,从接收垃圾值到崩溃/段错误,再到全球热核战争。

【讨论】:

  • 谢谢你 hobbs :-)。我肯定不会取消引用 p。请查看编辑。
【解决方案2】:

这将导致未定义的行为。如果您尝试通过取消引用来对 p 执行任何操作,程序将抛出分段错误或执行您不想要的其他操作。

【讨论】:

  • 为什么会是UB?它只是一个指针递减,没有任何取消引用的尝试。
  • 'int *p;'因此,函数中的 in 将是 UB,即使它被分配到下一行。
  • 看来我所有的嵌入式固件都有奔腾的UB:(
  • @EugeneSh。使用指针算术来获取对象内部以外的指针或数组末尾之后的指针是 UB。转换指针整数只是实现定义的,而不是UB。
  • 你们可以私下讨论一下吗?我厌倦了收到通知。
【解决方案3】:

在访问分配区域之外的内存时,您并不总是遇到段错误。访问的内存可能被分配,只是分配给别的东西。所以这两种情况都可能发生,但都是不受欢迎的行为。

允许指针 p 包含一个“坏”指针,并且不会发生不良行为。考虑它未初始化时的状态。如果您通过取消引用来使用指针,那么您将遇到段错误或访问其他人的内存,这是不受欢迎的行为。

【讨论】:

  • 我猜 OP 的意思是没有执行这样的访问。指针递减,就是这样。不会取消引用。
  • 确实如此。 @sjsam,指针 p 允许包含“坏”指针,不会发生不良行为。如果您通过取消引用来使用指针,那么您将遇到段错误或访问其他人的内存,这是不受欢迎的行为。
  • @MartinJames:你是对的,我相信我不会取消引用 p。 :-)
猜你喜欢
  • 1970-01-01
  • 2022-12-18
  • 1970-01-01
  • 2011-02-08
  • 2017-08-18
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多