- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
PS,我知道指针是什么以及如何使用指针,但对一件事感到困惑。我已经尝试过在 stackoverflow 上搜索这个问题:
int *ptr = 20 //why illegal or seg fault or crash?
printf("%i", *ptr) // Seg Fault
printf("%i", ptr) // Output -> 20
printf("%p", &ptr) // Returns a valid address.
并发现,通过直接将值分配给指针而不使用 malloc 或 null 初始化,意味着我们对编译器说,嘿 CPU,在内存中创建一个空间来在给定的确切地址处存储整数值,在本例中为 20。所以基本上是告诉编译器在地址为 20 的 RAM 中为 INT 腾出一个位置。通过这样做,我们正在接触系统内存或非法空间。
但我不明白的是,
How the integer 20 can directly be referenced as a memory?
What happens when we do the same for float or char? for example float *ptr = 20.25
I tried directly converting c code to assembly with a website, for a legal and illegal pointer example, where I see that the same registers are called, same MOV operations are done, And no explicit "MAKE SPACE AT given ADDRESS" instructions were set.
我已经尝试了一切可能的方法来理解这一点,但还是不行。你们能指出我正确的方向吗?谢谢...
最佳答案
How the integer 20 can directly be referenced as a memory?
使用我的 C++ 编译器,它无法编译:我收到此错误:
temp.cpp:22:14: error: cannot initialize a variable of type 'int *' with an
rvalue of type 'int'
int * x = 20;
它确实编译为 C,尽管有此警告:
temp.c:12:11: warning: incompatible integer to pointer conversion initializing
'int *' with an expression of type 'int' [-Wint-conversion]
int * x = 20;
但是,这确实可以在 C 和 C++ 下编译:
int * x = (int *) 20;
...它可以编译,因为 20 是一个格式良好的内存地址(它指定距进程内存空间开头 20 个字节的内存位置)。
请注意,在大多数操作系统上,它不是可用的内存地址;大多数操作系统将地址空间的前几页标记为“不可读/不可写”,这样当有人试图取消引用 NULL 指针时,它们可能会导致进程崩溃(否则会导致进程以较小的速度读取或写入内存)从内存空间开始的偏移量)
What happens when we do the same for float or char? for example float *ptr = 20.25
这些类型无法编译,因为浮点(或字符)值作为内存地址没有意义。在大多数环境中,内存地址是距内存空间顶部的整数偏移量,因此如果您想将其指定为常量(顺便说一句,您通常不想这样做,除非您在非常低的级别上工作,例如直接在嵌入式 Controller 中寻址 DMA 硬件),它需要是一个整数常量。
And no explicit "MAKE SPACE AT given ADDRESS" instructions were set.
这是预料之中的——设置一个指向值的指针不会隐式地为任何东西腾出空间,它只是将指针设置为指向指定常量的内存地址。
Lastly, What exactly happens when we declare strings by doing char *ptr = "Hello"?
在这种情况下,编译器会识别出您已声明一个字符串常量,并将该字符串作为只读数组添加到进程的内存空间中。完成此操作后,它可以将指针设置为指向该数组的开头。请注意,此行为特定于字符串常量,不会延续到 int 或 float 等其他数据类型。
另请注意,是字符串常量的声明触发了该常量的添加,而不是指向该常量的指针的设置。例如,如果您有以下代码:
const char * s1 = "Hello";
const char * s2 = "Hello";
printf("s1=%p s2=%p\n", s1, s2);
...您将看到如下输出:
s1=0x104608f4e s2=0x104608f4e
...请注意,两个指针都指向同一内存位置;由于两个字符串相同且只读,因此编译器可以通过仅分配字符串数据的单个实例来节省内存。
相反,如果你这样做:
const char * x = (const char *) 20;
...您会遇到与 int *
示例中遇到的完全相同的问题。
关于c++ - 直接用变量设置指针意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58785802/
我在 OS X 中构建菜单栏项时找到了一些示例代码。它使用了单个 |我不确定它的实际含义。 (我想做的是在菜单项左键单击时调用一个函数,但在右键单击时显示菜单) 这是我的代码 //Get refere
为什么它在第 23 行抛出编译错误。'a' 是 Apple 类的对象,col 是包含 Apple 对象的列表,但它仍然是抛出下面提到的编译错误: 类型 Collection 中的方法 add(capt
我有一个类A,它扩展了抽象类B。 让B有一个 protected 字段值 我想在 A 中使用这个字段。如果 A 没有 value,我可以编写 this.value 从 B 获取它。 与super.va
DBLint 用于检查数据库状态。有46条规则。在 www.dblint.org 上对每条规则都有一些简单的解释,但对规则 31 的描述如下: 定义的主键不是最小键:主键是最小的 super 键。如果
var aa: (()?) = (john.residence?.address = someAddress) var bb: ()? = john.residence?.printNumberOfR
我对 jquery 的可重用插件有点陌生。我已经多次遇到这段代码,但无法弄清楚究竟发生了什么。 (function( $ ){ ... })( jQuery ); 谁能帮我解答一下吗? 最佳答案
这个问题已经有答案了: int foo (int argc, ...) vs int foo() vs int foo(void) in C (4 个回答) 已关闭 9 年前。 所以我最近在 Hack
typedef struct Element { struct Element *next; void *data; } Element; 在 pop 函数中,(!(elem = *s
数据加载两次...意味着 AsyncTask onPostExecute 加载相同的数据两次?我的 AsyncTask onPostExecute 运行两次它加载相同的数据...我正在运行异步任务以从
运行“yomeanjs”时,我无限期地挂起“这可能需要几分钟”。当我尝试运行 grunt 时,它失败了,与 npm start 相同。 我使用的是 Win 8.1,并安装了最新的 Node 和 Mon
我正在看 big nerd ranch 的“Android Programming”中的这个页面,我对下面的句子感到困惑。它声明“当 Activity 被隐藏时, Activity 对象不存在”。这让
是否 const vector意味着它的元素是const也一样? 在下面的代码中, v[0].set (1234);在 void g ( const vector & v )产生编译器错误 const
我是 xml 相关事物的新手 我无法理解: SelectNodes(@"//Form/*[. = 'on']"); 注:SelectNodes是 XmlNode 的函数.(与 XmlDocument
我想方便地控制命令行参数。因此我想使用 ShellLib。 我的代码是这样的: ... #include ... EFI_STATUS EFIAPI UefiMain ( EFI_HANDL
着眼于更正 Debian 上/etc/init.d/hostapd 中的一个问题。但是,我不知道这行代码是做什么的,也不知道它是如何工作的 [ -n "$DAEMON_CONF" ] || exit
有没有人遇到过类似我下图所示的情况? 我有一个变量 landingBools.didSlowPast40Knots(正如您从调试打印输出中看到的那样)为假,但出于某种原因,if 语句评估为真。 知道为
我设法使用 flexbox 和一些非常基本的 JavaScript 为自己构建了三个下拉菜单。 因为我不太了解,所以我使用了一个简单的函数三次,而不是使用参数、变量和其他东西。我将其称为丑陋的“蛮力”
这周刚开始学习 javascript。我有一个非常菜鸟的问题。 exports.displayName = (undefined: ?string); 在 React Native 中意味着什么? 这
我正在阅读有关 NaN here 的内容它说: A comparison with a NaN always returns an unordered result even when compari
编码格式:引入*表示“从头开始重复”。例子。输入-{a,b,a,b,c,a,b,a,b,c,d}可以写成{a,b,*,c,*,d}。输出:5;例如2:ABCABCE,输出- 5。 这里*表示从头开始重
我是一名优秀的程序员,十分优秀!