【问题标题】:Pointer can point to memory are that is not allocated?指针可以指向内存是不是没有分配?
【发布时间】:2018-11-05 03:15:17
【问题描述】:

考虑以下代码:

int *p;
p = malloc(1);//p can point to 1 byte memory area

为什么p 可以指向很多像下面这样的内存区域?

printf("%p %p %p %p %p",p,p+1,p+2,p+3,p+4);

【问题讨论】:

  • C 上没有训练轮。您可以创建 p = 0; 然后取消引用 p 只是为了享受 SegFault。知道你分配了哪些内存以及哪些是有效的完全取决于你……这就是 C 获得极大速度的地方。它把正确“编程”的责任放在你身上。如果您分配1-byte,则由您来确保每次使用该分配访问的次数不超过1-byte。这正是它应该的方式。作为程序员,您可以完全控制程序使用的每个内存字节——明智地使用它。

标签: c memory-management malloc pointer-arithmetic


【解决方案1】:

p+1p+2等案例,导致undefined behaviour。如该页面所述,您的程序不符合 C 语言的规则,因此您可能得到的任何行为都是毫无意义的。

【讨论】:

  • p+1 是否允许?你确定,考虑到p 指向一个字节?实际上,分配int* p = malloc(1); 甚至定义明确且有损吗?
  • @Deduplicator 哦,对不起,由于某种原因,我把它读作char *
  • 可能是因为,你知道,它会有意义。 ;-)
【解决方案2】:

C 不做任何内存地址检查。这是使 c 非常高效但也更难编程的原因之一。指针只是一个变量,与其他任何变量一样,存储二进制数据,并且仅通过数据应该是内存地址这一事实来区分。指针算法在例如 c 数组的情况下是完全有效的。

您还可以设置一个指向随机或任意值的指针。但是除非您这样设计它,否则取消引用不是来自编译器或 malloc 的任何地址将导致访问您自己的某些程序内存空间或分段错误。

【讨论】:

  • 指针算法只在对象的范围内有效(或结束)
猜你喜欢
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多