我知道每个人都讨厌搞砸.在我的代码中,由于我考虑过并且很满意的原因,他们提供了一个有效的解决方案(即我不是在寻找"不要那样做"作为答案,我理解你的预订,并理解我为什么使用它们无论如何).
到目前为止,它们一直很棒,但我希望以这样的方式扩展功能,这要求我基本上能够存储指向标签的指针,然后再转到它们.
如果此代码有效,它将代表我需要的功能类型.但它不起作用,30分钟的谷歌搜索没有透露任何东西.有没有人有任何想法?
int main (void)
{
int i=1;
void* the_label_pointer;
the_label:
the_label_pointer = &the_label;
if( i-- )
goto *the_label_pointer;
return 0;
}
Run Code Online (Sandbox Code Playgroud) class Address {
int i ;
char b;
string c;
public:
void showMap ( void ) ;
};
void Address :: showMap ( void ) {
cout << "address of int :" << &i << endl ;
cout << "address of char :" << &b << endl ;
cout << "address of string :" << &c << endl ;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
address of int : something
address of char : // nothing, blank area, that is nothing displayed
address of …
Run Code Online (Sandbox Code Playgroud) 谁可以给我解释一下这个?所以我一直在python中使用id()命令,并遇到了这个:
>>> id('cat')
5181152
>>> a = 'cat'
>>> b = 'cat'
>>> id(a)
5181152
>>> id(b)
5181152
Run Code Online (Sandbox Code Playgroud)
除了一部分之外,这对我有意义:字符串'cat'在我将其分配给变量之前在内存中有一个地址.我可能只是不明白内存寻址是如何工作的,但是有人可以向我解释这一点,或者至少告诉我应该读一下内存寻址吗?
所以这一切都很好,但这让我更加困惑:
>>> a = a[0:2]+'t'
>>> a
'cat'
>>> id(a)
39964224
>>> id('cat')
5181152
Run Code Online (Sandbox Code Playgroud)
这让我感到很奇怪,因为'cat'是一个地址为5181152的字符串,但是新的a具有不同的地址.所以,如果内存中有两个'cat'字符串,为什么不为id('cat')打印两个地址?我最后的想法是连接与地址的变化有关,所以我尝试了这个:
>>> id(b[0:2]+'t')
39921024
>>> b = b[0:2]+'t'
>>> b
'cat'
>>> id(b)
40000896
Run Code Online (Sandbox Code Playgroud)
我本来可以预测ID是相同的,但事实并非如此.思考?
当我运行此代码.
#include <stdio.h>
void moo(int a, int *b);
int main()
{
int x;
int *y;
x = 1;
y = &x;
printf("Address of x = %d, value of x = %d\n", &x, x);
printf("Address of y = &d, value of y = %d, value of *y = %d\n", &y, y, *y);
moo(9, y);
}
void moo(int a, int *b)
{
printf("Address of a = %d, value of a = %d\n", &a, a);
printf("Address of b = %d, value of b …
Run Code Online (Sandbox Code Playgroud) 我正在阅读操作系统概念,我在第8章!但是,我可以使用一些澄清,或者保证我的理解是正确的.
逻辑地址:根据本书,CPU生成逻辑地址.这到底是什么意思?(在执行生成的地址系统中..)我假设在为程序编译代码时,程序不知道代码将在何处加载到内存中.所有编译器都会设置程序布局的一般草图以及图像的布局方式,但不会为其分配任何实际地址.当程序执行时,CPU获取编译器生成的这个布局图像,并将一些地址(逻辑1)分发给从代码生成的地址.
物理地址:直到CPU生成一组逻辑地址(由基地址和偏移量组成)之后才生成物理地址.逻辑地址通过MMU或其他设备,沿着线路的某处,逻辑地址映射到物理RAM地址.
那么实际差异是什么?我可以看到一个好处.使用逻辑地址为应用程序提供了更多自由.如果物理地址是硬编码的,那么程序的成功将在很大程度上取决于物理计算机,可用的RAM地址等.
转换为物理地址的逻辑地址的使用是否会产生两个步骤而不是一对一,因此更多地超过?
然后逻辑地址在生成后驻留在哪里?它们可能存在于CPU上的寄存器中,而CPU正在为一个进程提供服务,但在它之前和之后,它们去哪里了?我理解这是依赖于实现的.我假设它们可能存储在CPU的某些特殊寄存器空间或缓冲区中,例如TLB,对吗?如果没有,那么表可能存在于实际的RAM本身中,而CPU只保存一个指针/地址到RAM中表的基地址,对吗?
看起来保持RAM中的地址对逻辑存储器地址的目的是有效的.我只能假设我的理解不正确.
由于该函数是存储在一个连续内存块中的指令集.
并且函数(入口点)的地址是函数中第一条指令的地址.(据我所知)
因此我们可以说函数的地址和函数中第一条指令的地址是相同的(在这种情况下,第一条指令是变量的初始化.).
但是下面的程序与上述内容相矛盾.
码:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
char ** fun()
{
static char * z = (char*)"Merry Christmas :)";
return &z;
}
int main()
{
char ** ptr = NULL;
char ** (*fun_ptr)(); //declaration of pointer to the function
fun_ptr = &fun;
ptr = fun();
printf("\n %s \n Address of function = [%p]", *ptr, fun_ptr);
printf("\n Address of first variable created in fun() = [%p]", (void*)ptr);
cout<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
一个输出示例是:
Merry Christmas :)
Address of …
Run Code Online (Sandbox Code Playgroud) 我正在尝试调试使用大量指针的二进制文件.有时为了快速查看输出以找出错误,我打印出对象的地址及其相应的值,但是,对象地址是随机的,这违背了快速检查的目的.有没有办法临时/永久禁用它,以便每次运行程序时都得到相同的值.
哎呀.操作系统是Linux fsttcs1 2.6.32-28-generic #55-Ubuntu SMP Mon Jan 10 23:42:43 UTC 2011 x86_64 GNU/Linux
在运行Linux的基于ARM的系统上,我有一个内存映射到物理地址的设备.从所有地址都是虚拟的用户空间程序,我如何从该地址读取内容?
假设我声明了以下内容:
section .bss
buffer resb 1
Run Code Online (Sandbox Code Playgroud)
这些说明如下:
mov al, 5 ; mov-immediate
mov [buffer], al ; store
mov bl, [buffer] ; load
mov cl, buffer ; mov-immediate?
Run Code Online (Sandbox Code Playgroud)
我是否理解bl将包含值5,并且cl将包含变量的内存地址section .text
?
我对两者之间的差异感到困惑
buffer
vsmov cl, buffer
更新:阅读回复后,我认为以下摘要是准确的:
假设声明mov cl, [buffer]
存在于mov edi, array
.我的理解是:
edi
将第0个数组索引的内存地址放入mov byte [edi], 3
.add edi, 3
将VALUE 3放入数组的第0个索引中edi
,mov al, [array]
现在包含数组第3个索引的内存地址al
将DATA置于第零个索引中mov al, [array+3]
.al
将DATA放在第三个索引处mov [al], …
我很难理解C中数组名称的类型和用法.这可能看起来很长,但请耐心等待.
我理解以下语句声明a
是类型,int []
即整数数组.
int a[30];
Run Code Online (Sandbox Code Playgroud)
同时a
也指出数组的第一个元素和类似*(a+2)
的东西是有效的.因此,a
看起来像一个指向整数的指针.但实际上类型int []
和int*
不同; 前者是数组类型,后来是指向整数的 指针.
类型int []
变量int*
在传递给函数时也会转换为类型变量; 因为C
数组是通过引用传递的(sizeof
运算符除外).
这就是让我垂涎的观点.看看下面这段代码:
int main()
{
int (*p)[3];
int a[3] = { 5, 4, 6 };
p = &a;
printf("a:%d\t&a:%d\n",a,&a);
printf("%d",*(*p + 2));
}
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
a:2686720 &a:2686720
6
Run Code Online (Sandbox Code Playgroud)
那么,上面的代码是如何工作的呢?我有两个问题:
a
并&a
具有相同的值.为什么?int (*p)[3];
做什么的?它声明了一个 …