通过使用该命令,我发现内存中的objdump地址包含 start the path ,并且由于 C 标准,该路径以一个字节结束。0x02a8/lib64/ld-linux-x86-64.so.20x00
因此,我尝试编写一个简单的 C 程序来打印这一行(我使用了 Denis Yurichev 所著的《RE for Beginners》一书中的示例 - 第 24 页):
#include <stdio.h>
int main(){
printf(0x02a8);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但我很失望地得到了分段错误而不是预期的/lib64/ld-linux-x86-64.so.2输出。
我发现使用这样一个printf不带说明符或至少不带指针转换的“快速”调用很奇怪,所以我尝试使代码更自然:
#include <stdio.h>
int main(){
char *p = (char*)0x02a8;
printf(p);
printf("\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
运行后我仍然遇到分段错误。
我不相信这是因为内存区域受限而发生的,因为在书中,第一次尝试一切都很顺利。我不确定,也许还有那本书中没有提到的事情。
因此,需要一些清晰的解释来解释为什么每次我尝试运行程序时都会发生分段错误。
我正在使用最新的完全升级的 Kali Linux 版本。
正如您所看到的,我只是获取一个变量地址并通过其他变量和指针来回获取它。通过 printf 我可以看到地址 1、值 2 和地址 2 都具有相同的值。但是当我尝试取消引用address2(与address1和&value具有相同的值)时,我收到错误。为什么?
#include <stdio.h>
#include <stdint.h>
int main()
{
uint32_t value = 0;
uint32_t* address1 = NULL;
uint32_t* address2 = NULL;
address1 = &value;
printf("address1: %x\n", address1);
uint32_t value2 = (uint32_t)address1;
printf("value2: %x\n", value2);
address2 = (uint32_t*)value2;
printf("address2: %x\n", address2);
uint32_t value3 = *address2; //fault here
printf("*value2: %u\n", value3);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 为了理解指针,我编写了下面的代码。
#include <cstdio>
#include <iostream>
using namespace std;
int main() {
string a = "hello";
const char *st = &a[0];
printf("%p\n", &st[0]);
printf("%p\n", &(a[0]));
printf("%c\n", *st);
printf("%p", &a);
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出
0x1265028
0x1265028
h
0x7ffe26a91c40
Run Code Online (Sandbox Code Playgroud)
如果我的理解是正确&a的应该返回字符串的地址,为什么返回的值与&a其余的不同?
通过在我的计算机上运行这个程序,我得到了相同的地址。我支持 的情况array,&array[0]我理解 的名称array指向 中第一项的地址array。而且两者都是一样的。
但我无法理解为什么 name ofarray和&array指向同一个地址。我想到的是,它将打印存储数组中第一项地址的指针的地址。
#include <stdio.h>
int main()
{
char arr[3];
printf("array = %p\n", arr);
printf("&array[0] = %p\n", &arr[0]);
printf("&array = %p\n", &arr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
array = 0061FF1D
&array[0] = 0061FF1D
&array = 0061FF1D
Run Code Online (Sandbox Code Playgroud) 我有一个地址的例子:0x003533,它是一个字符串,但要使用它我需要它是一个很长但我不知道该怎么做:S有任何人的解决方案吗?
所以字符串:"0x003533"到长0x003533 ??
我在教科书中找到了以下代码:
#include<stdio.h>
void disp( int *k)
{
printf("%d",*k);
}
int main( )
{
int i ;
int marks[ ] = { 55, 65, 75, 56, 78, 78, 90 } ;
for ( i = 0 ; i <= 6 ; i++ )
disp ( &marks[i] ) ;
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
代码工作正常,但我对逻辑有疑问:
我发送数组变量的地址.但是在disp函数中我使用指针变量作为参数并打印指针的值.因此,从main函数发送的参数类型应该与参数不匹配disp.那么它是怎样工作的?
我试着通过改变disp函数来做同样的事情
void disp( int (&k))
{
printf("%d",*k);
}
Run Code Online (Sandbox Code Playgroud)
但是我收到了一个错误.我应该怎么做才能使地址作为一个论点,即void disp(int &k)?
考虑以下测试程序(键盘执行):
#include <stdio.h>
#include <string.h>
struct camp {
char b[8];
};
int main()
{
struct camp c;
strcpy(c.b, "Hello");
c.b[5] = '\0';
printf("c size: %d\nAddress (amp): %d :: %d\n", sizeof(c), &c, c);
printf("Address of b: %d :: %d\n", &(c.b), c.b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
示例输出:
c size: 8
Address (amp): -1082463628 :: 1819043144
Address of b: -1082463628 :: -1082463628
Run Code Online (Sandbox Code Playgroud)
由(&(c.b)和c.b第二次调用printf)给出的地址相同,struct camp c(第一次调用printf)返回不同的地址.此外,&c与&(c.b)或相同c.b.
究竟发生了什么?
在C中使用以下表达式来获取特定元素的地址.
&a[x]
Run Code Online (Sandbox Code Playgroud)
返回的值的类型是什么?这取决于什么?是通过召集始终相同还是依赖于操作系统?
我需要知道这个因为:
我需要从这个指针中提取一个位模式,所以我试图理解该值是十六进制还是二进制.当你说一个指针是这样的:0x25434或像0111000111?
因为这将影响我如何提取我的位
说你在C中有一个字符数组.像这样:
char array[];
Run Code Online (Sandbox Code Playgroud)
现在,下面的哪些陈述将打印出地址.我知道1)和2)会,但3)还打印出地址吗?
1) printf("Arrays adress is %x\n", array);
2) printf("Arrays adress is %x\n", &array[0]);
3) printf("Arrays adress is %x\n", &array);
Run Code Online (Sandbox Code Playgroud) 所以我有以下8个元素的int数组:
int v[8] = {0, 1, 2, 3, 4, 5, 6, 7};
Run Code Online (Sandbox Code Playgroud)
我将此数组作为循环中的参数传递给函数
while(i < N) {
.
.
function(v);
.
.
}
Run Code Online (Sandbox Code Playgroud)
在这个函数中我使用前4个元素,在下一个循环中我想增加数组地址4个位置,这样我就可以使用最后4个元素.因为int是4个字节,所以我想的是:
while(i < N) {
.
.
function(v);
.
*v += 16;
}
Run Code Online (Sandbox Code Playgroud)
但是,这并没有达到我的预期.
注意:因为我正在使用嵌入式系统,所以我无法使用malloc.我的阵列必须以我相信的方式宣布.
问题(编辑):
如何增加我的数组的地址,以便第二次迭代v指向v [4]?