Tag: 内存地址

L值与C中的R值

我正在回答这本教科书中的教科书问题。 我正在学习C中的指针,并且遇到了l值和r值。 根据我的理解: l-values are values that are defined after they are executed (++x) r-values are values that are not defined after they are executed (x++) 这是正确的吗? 我想回答的问题(我的尝试): a) Which of the following C expressions are L-Values? 1. x + 2 Not a L value 2. &x Is a L value 3. *&x Is a […]

有什么内存地址空间?

使用了什么forms的内存地址空间? 今天,大型扁平虚拟地址空间很常见。 从历史上看,已经使用了更复杂的地址空间,例如一对基地址和偏移量,一对段号和一个偏移量,一个字地址加上一个字节或其他子对象的索引,依此类推。 有时,各种答案和评论断言C / C ++指针本质上是整数。 这是一个不正确的C / C ++模型,因为各种地址空间无疑是一些关于指针操作的C规则的原因。 例如,不在数组之外定义指针算法简化了对基本和偏移模型中指针的支持。 指针转换的限制简化了对地址加额外数据模型的支持。 这种反复出现的断言激发了这个问题。 我正在寻找有关各种地址空间的信息,以说明C / C ++指针不一定是一个简单的整数,并且考虑到要支持的各种机器,C / C ++对指针操作的限制是明智的。 有用的信息可能包括: 具有各种地址空间和这些空间的描述的计算机体系结构的示例。 在当前正在制造的机器中仍在使用的各种地址空间的示例。 引用文档或解释,尤其是URL。 详细说明地址空间如何激发C / C ++指针规则。 这是一个广泛的问题,所以我愿意接受有关管理它的建议。 我很乐意看到一个通用包容性答案的协作编辑。 然而,这可能无法授予应得的声誉。 我建议投票多个有用的贡献。

内存如何分配给不同数据类型的变量?

我写了以下代码。 #include int main() { int x = 1 ; int *j = &x ; int y = 2 ; int *t = &y ; printf(“%p\n” , (void *)j); printf(“%p” , (void *)t); } 输出为0028FF14 0028FF10 。 我要说的是,地址之间的差异是“4”。 而在这种情况下 #include int main() { char x = ‘t’ ; char *j = &x ; char y […]

gdb地址和“真实”地址之间的区别?

如果我在gdb中运行一个C / C ++程序(在使用-g标志编译之后)并检查某些变量,参数等的地址,然后我在gdb之外运行它(使用./ )将这些地址和我在gdb中看到的一样? 如果它们不同,它们通常是相似的,还是会大不相同? 我问这个是因为我有一个缓冲区溢出程序,它在gdb(有和没有断点)中完美运行,但是当我尝试在gdb之外运行它时它不起作用。

用于迭代像数组一样的struct成员的C方法?

假设我有一个矢量类: typedef struct vec3_s { float x, y, z; } vec3; 但是,我希望能够迭代它而不将其转换为浮点数组。 虽然在这种情况下演员阵容是可以接受的,但我很想知道在C ++中是否有任何类似function的东西在C语言中是可行的。例如,在C ++中,因为std::vector具有subscript []运算符重载,我可以将其第一个索引的地址传递给一个带void*的函数void* 。 即 void do_something_with_pointer_to_mem( void* mem ) { // do stuff } int main( void ) { std::vector v; // fill v with values here // pass to do_something_with_pointer_to_mem do_some_with_pointer_to_mem( &v[ 0 ] ); return; } 另一个更具体的例子是在OpenGL中使用glBufferData(…)时(使用C ++时): glBufferData( […]

内存地址c中的正值或负值?

在c中,我试图打印出变量的地址和某些function的地址。 我得到一个是负值,另一个是正值。 我的问题是:为什么C不代表所有负面或所有正面价值? 这是我的代码: int foo() { return 0; } int main() { int a; printf(“%d\n”,&a); printf(“%d\n”,foo); return 0; } 结果如下: -1075908992 134513684

通过c / c ++中的内存地址调用函数

鉴于函数原型及其在内存中的地址的知识,是否可以从另一个进程或一些只知道原型和内存地址的代码调用此函数? 如果可能,如何在代码中处理返回的类型?

正确的格式说明符打印指针或地址?

我应该使用哪种格式说明符来打印变量的地址? 下面很多我很困惑。 %u – 无符号整数 %x – hex值 %p – 无效指针 哪个是打印地址的最佳格式?

在不是地址/指针的值上使用LEA?

我试图理解地址计算指令是如何工作的,特别是使用leaq命令。 当我看到使用leaq进行算术运算的例子时,我感到困惑。 例如,以下C代码, long m12(long x) { return x*12; } 在组装中, leaq (%rdi, %rdi, 2), %rax salq $2, $rax 如果我的理解是正确的,leaq应该移动任何地址(%rdi, %rdi, 2) ,这应该是2*%rdi+%rdi ,评估为%rax 。 我感到困惑的是因为值x存储在%rdi ,这只是存储器地址,为什么%rdi乘以3然后左移这个存储器地址 2等于x乘以12? 是不是当我们将%rdi乘以3时,我们跳转到另一个不保持值x的内存地址?

为什么我不能像C中的指针一样处理数组?

我在SO上看到了很多这个问题。 也许没有那么多的话……但是一次又一次地存在关于数组如何与指针不同的混淆。 所以我想我会花一点时间来问这个问题。 出于本Q&A的目的,我们将假设一个32位系统,并且已声明以下内容: char * ptr = “hello”; char arr[10] = “hello”; int iarr[10] = {0}; 这是一个问题列表,可以推测我在SO上看到的混乱。 当我看到新的问题时,我会添加到我的问答清单中(其他人也可以随意使用,如果您发现任何错误,请纠正我!) 指针和数组不是基本相同的东西吗? 跟进: *(ptr)和*(arr) ,或ptr[0]和arr[0]给出相同的东西,为什么? 为什么arr和&arr的价值相同? 跟进:为什么我得到一个不同的值打印arr+1 vs &arr+1 ?