繁体   English   中英

当所有值都不为空时结构的分段错误

[英]Segmentation Fault For Struct When All Values Are Non-Null

char *s = sbrk(some_num); 
if (s != (char *)-1) {    
  some_struct = (SomeStruct *)s;
  some_struct->num = 8; //num is an int [*SEG FAULT OCCURS ON THIS LINE*]
}

使用gdb进行调试:

p some_struct  => (SomeStruct *) 0xef7100
p some_struct->num  => 0

从先前的问题中,我了解到当某些东西为NULL时会发生段错误,但是在此示例中,some_struct,some_struct-> num和8均为非NULL

为什么会出现分段错误? 如何将some_struct-> num设置为一些int值?

指针some_struct需要指向一些有效的内存。 如果函数some_function返回指向某个局部volatile变量的指针,则退出some_function时该变量将丢失。

为了避免出现段错误,您可以在some_function中将局部变量声明为静态变量,或者可以通过让some_function调用malloc从堆中分配内存。 如果some_function使用malloc分配内存,则调用者有责任确保稍后释放内存。

避免段错误的另一种方法是不将指针返回到局部变量,而是返回全局变量。 但是,大多数人都认为应该避免使用全局变量。

熟悉当今大多数现代OS背后的虚拟内存的概念是值得的。

在具有虚拟内存的操作系统下,每个内存地址(实际上是虚拟地址)都类似于电话号码,因为您无法以大约10位数字的每种组合呼叫某人。

您只能拨打电话簿中列出的电话号码。

否则,您会听到“对不起,此号码目前无法使用”。

同样,只有每个进程的“页表”中列出的虚拟地址(始终由OS自动透明地维护)才对进程有效。

SEGV是OS的一种说法:“抱歉,该虚拟地址当前无法使用。”

malloc (和sbrk )基本上可以要求OS为您分配指定大小的内存块并将其地址注册到页表中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM