Tag: 内存地址

特定内存地址的内容与gdb中预期的不同

我有类型为int的变量i,其值为129.我在gdb中使用了此变量的各种表示。 # Decimal format of i (gdb) p/di $18 = 129 # Binary format of i (gdb) p/ti $19 = 10000001 # Address of variable i (gdb) p &i $20 = (int *) 0xbffff320 # Binary format displayed at one byte (gdb) x /tb &i 0xbffff320: 10000001 # Decimal format displayed at four bytes (one […]

在ac程序中打印相同的物理地址

有没有办法在这些程序中打印相同的物理地址(使用共享内存概念)而不是打印不同的逻辑地址? 我打印相同物理地址的原因:… / *这是可选的,因为我提供了许多不属于核心的信息* / 在我的实验室中,我有两个程序:一个通过共享内存概念将字符串存储在物理内存中,另一个通过访问共享内存来打印相同的字符串。 计划1: #include #include #include #include #include main() { key_t key; int shmid; char* addr1; key = ftok(“/home/tamil/myc/pws.c”,’T’); shmid = shmget(key,128*1024,IPC_CREAT|SHM_R|SHM_W); addr1 = shmat(shmid,0,0); printf(“\nIPC SHARED MEMORY”); printf(“\n SENDER ADDRESS”); printf(“\nTHE ADDRESS IS %p”,addr1); printf(“\nENTER THE MESSAGE:”); scanf(“%s”,addr1); printf(“\nMESSAGE STORED IN %p IS %s”,addr1,addr1); } 计划2: #include #include #include #include […]

打开Watcom Inline汇编SEG和OFFSET运算符

今天,我已经了解到MASM中的SEG运算符默认返回GROUP的地址而不是相关表达式的SEGMENT的地址,并且有选项和方法来覆盖它。 由于我目前正在Open Watcom 1.9 / 16位DOS中进行复杂的项目,其中C和汇编(内联和独立)混合(实际上,DOS仅用于启动,然后我自己的MINI-OS控制),并且因为我知道WASM在某种程度上与MASM兼容,我有以下问题: 在进行内联汇编并获取变量段时,SEG运算符是否返回变量所在的GROUP或SEGMENT? 假设有一个名为MY_GROUP的GROUP,一个名为MY_SEG且属于MY_GROUP的SEGMENT,以及一个名为MY_VAR的变量/标签,它位于MY_SEG中。 然后,如果我这样做 _asm { MOV AX, SEG MY_VAR } 哪个值加载到AX? 它是MY_GROUP的地址还是MY_SEG的地址(假设它们不同)? 我没有找到任何与内联汇编中的问题相关的命令行开关。 然后我尝试了MASM语法: _asm { MOV AX, SEG MY_GROUP:MY_VAR MOV AX, SEG MY_SEG:MY_VAR } 上述两行都会导致以下错误:“只允许段或组标签”。 请注意,我的问题仅与内联汇编有关。 实际上,我使用JWASM作为独立的汇编模块,上面的语法效果很好,并且具有预期的结果。 有人能告诉我内联汇编程序在这种情况下做了什么,以及是否有办法控制其各自的行为? 非常感谢你!

C:为什么指针和指针有不同的值?

如果我在OS X上运行以下命令: int main (void) { int* n; // initialise(declare) pointer *n = 20; // the value in address pointed to by n is 20 printf(“n: %i, n&: %i\n”, n, &n); return 0; } 我明白了: n:1592302 512 ,n&:1592302 480 为什么价值观不同?

在C中与STM32芯片的内存交互

我想与STM32芯片的内存 STM32L476 进行交互 ,首先读取并存储其电子签名 (MCU_ID),然后在其内存中写入数据 。 我正在使用链接到JTAG ST-LINK的STM32QFP64插槽。 我在C方面做得很好但是真的开始嵌入式编程所以我选择了Atollic Studio IDE,因为它看起来非常完整并且基于Eclipse,我之前已经使用过。 我的问题是我找不到某种文档列出函数,变量等我可以用来与芯片进行交互。 我搜索了ST网站上提供的几乎所有PDF文件,阅读ST的GitHub,但由于我是初学者,我可能错过了这些信息,因为我不知道我在搜索什么样的内容。 下面的代码是不完整的 , 完全是想象的 ,但它可以帮助理解我想要做的事情,我想象的是这样: #define MEMORY_ADRESS_MCU_ID FFFFF // A memory adress ( I should be able to find it in STM32L476 documentation) #define MEMORY_ADRESS_TO_WRITE FFFF // Same unsigned extractMCUID() { return READ_IN_MEMORY(MEMORY_ADRESS_MCU_ID); // Returns the ID stored in a particular memory adress […]

malloc指针地址在main和其他函数的区别

我有以下问题。 为什么以下示例中的两个指针的地址存在差异? 这是完整的代码: #include #include void *mymalloc(size_t bytes){ void * ptr = malloc(bytes); printf(“Address1 = %zx\n”,(size_t)&ptr); return ptr; } void main (void) { unsigned char *bitv = mymalloc(5); printf(“Address2 = %zx\n”,(size_t)&bitv); } 结果: Address1 = 7ffe150307f0 Address2 = 7ffe15030810

C:地址运算符(&)是否产生指针(地址+类型)或地址?

我读到的关于地址运算符的大部分内容都用来表示它 – 一个地址。 我最近听到它的描述不同,因为它产生了一个完整的指针。 鉴于以下C代码, int i1 = 5; int *p1; p = &i1; 我的理解是p1通过存储i1的数据存储的地址来引用int 5 ,并记住该位置的数据将被解释为int (它指示要读取的字节数和如何解释读取数据)。 地址运算符是否同时产生地址和“类型感知”,或者类型感知是否隐含,因为p1被声明为int指针? 让我对此感到疑惑的一件事就是看到如下代码: void myFunc(int *ptr); int i = 5; myFunc(&i);

(&)的地址给出了编译器生成的地址或加载器生成的地址?

int a; printf(“address is %u”, &a); 这是哪个地址..? 我的意思是这是一个编译器生成的地址,即虚拟地址或加载器给出RAM中的物理地址..? 因为它每次打印不同的地址,我想它必须是RAM中的地址。 只是想确定一下。 请提供任何参考您的答案的链接。

指向数组的指针和指针指针有什么区别?

我是编程和学习数组指针的新手。 我现在有点困惑。 看看下面的程序: #include int fun(); int main() { int num[3][3]={23,32,478,55,0,56,25,13, 80}; printf(“%d\n”,*(*(num+0)+1)); fun(num); printf(“%d\n”, *(*(num+0)+1)); *(*(num+0)+0)=23; printf(“%d\n”,*(*(num+0))); return 0; } int fun(*p) // Compilation error { *(p+0)=0; return 0; } 这是我老师的笔记中写的程序。 在main()函数中,在printf()函数中,dereference运算符被使用了两次,因为num是指向数组的指针,因此第一次取消引用运算符将​​指向int ,然后第二个将给出指针所在的值指向。 我的问题是,当我将数组名称作为参数传递给函数fun()为什么使用*p ; 为什么不**p作为num是指向数组的指针? 第二件事为什么*(p+0)用于改变数组的第0个元素的值; 为什么不*(*(p+0)+0)=0因为main()函数*(*(num+0)+0)用于改变第0个元素的值? 整件事对我来说很困惑,但无论如何我必须要理解它。 我已经搜索了这个,发现指向数组的指针和指向指针之间有区别,但我无法理解。

数组的元素是否保证从较低地址存储到较高地址?

假设我有以下数组: int list[3]={2,8,9}; printf(“%p,%p,%p”,(void*)&list[0],(void*)&list[1],(void*)&list[2]); 是否始终保证&list [0] <&list [1] <&list [2] ? 我曾经认为使用C时它是一个严格而快速的规则,但现在必须非常肯定它作为一个OP只是在我回答关于endianness问题时问我这个问题 小端或大端 让我第二个想法的是stacks can grow up or down我不是很确定,所以你的严谨答案是值得赞赏的。谢谢。