我是C的新手,我有一个计算一些变量的函数.但是现在让我们简化一下.我想要的是拥有一个"返回"多个变量的函数.虽然据我所知,你只能在C中返回一个变量.所以我被告知你可以传递一个变量的地址并按这样做.这是我走了多远,我想知道我可以伸出援助之手.关于C90禁止的东西,我得到了一些错误.我几乎是肯定的,这是我的语法.
说这是我的主要功能:
void func(int*, int*);
int main()
{
int x, y;
func(&x, &y);
printf("Value of x is: %d\n", x);
printf("Value of y is: %d\n", y);
return 0;
}
void func(int* x, int* y)
{
x = 5;
y = 5;
}
Run Code Online (Sandbox Code Playgroud)
这基本上就是我正在使用的结构.有人能帮我一把吗?
上周我接受了采访.我被要求写一个宏来读取一个内存位置(比方说0x2000).我在正常编程中编写代码,但我无法编写宏.
请帮我弄清楚如何为下面的代码编写宏:
char *address = (char*)0x2000; // address is a pointer to address 3000 char val
*address = 36; // write 36 to 8 bit location at address
val = *address; // read 8 bit value from address
Run Code Online (Sandbox Code Playgroud) 我想知道为什么我们可以通过值将结构传递给C函数,但我们永远不能对数组(通过地址传递)做同样的事情.
当我学习C时,他们告诉我数组会消耗很多堆栈,因此不希望按值传递它们.
但似乎结构通常(如果不总是)大于数组并且是更复杂的数据结构,所以这个解释现在对我来说没有意义!
任何人都可以帮助尽可能多的细节吗?
只是试图掌握C++的复杂性,因此正在搞乱字符串和指针.但是,我遇到了一些我不太了解的事情.
首先,我使用相同的功能,据我所知,每次都给它相同的参数.我从主要和另一个函数调用它,并从每个函数获取略有不同的地址.从内存的某些部分读取数据的功能如下.
void printDataFromAddressForLength(char* pointer, long length)
{
cout << "\n" << endl;
for (int i=0; i<length; i++)
{
cout << "&pointer: " << &pointer + i << "\tData: " << pointer + i << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
这个函数的目标是在每一行上打印当前地址和值,然后迭代并可以从任何地方做同样的事情 - 非常简单的功能,没有真正的目的.
这是我在main()中的代码
MessageData messageData = returnStruct();
printDataFromAddressForLength(messageData.pChar, messageData.length);
Run Code Online (Sandbox Code Playgroud)
我也从returnStruct()函数调用printDataFromAddressForLength.这段代码如下所示.
// Returns MessageData from function
MessageData returnStruct()
{
static string staticTestString = "Time and time again";
MessageData metaData;
MessageData* pMetaData = &metaData;
pMetaData->pChar = &staticTestString[0];
pMetaData->length = staticTestString.length();
printDataFromAddressForLength(pMetaData->pChar, pMetaData->length);
return …Run Code Online (Sandbox Code Playgroud) 在下面的代码中,每次为第一个元素获取不同的地址std::vector v.为什么会这样?
#include <memory>
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v;
for (int i=0; i<10; ++i)
{
int b = i;
v.push_back(b);
std::cout << std::addressof(v[0]) << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
0x603010
0x603030
0x603010
0x603010
0x603050
0x603050
0x603050
0x603050
0x603080
0x603080
Run Code Online (Sandbox Code Playgroud) 如果2个程序正在运行,并且一个程序在内存地址存储一个数字,并且如果我知道该内存地址,并将其硬编码到第二个程序并打印出该地址的值,它是否会实际获得该信息?C++是否允许程序访问存储在RAM中的任何数据,无论它是否属于程序的一部分?
所以我有一些像这样的代码:
#include <iostream>
using namespace std;
class Base1 {};
class Base2 {};
class A
{
public:
A() {}
void foo(Base2* ptr) { cout << "This is A. B is at the address " << ptr << endl; }
};
A *global_a;
class B : public Base1, public Base2
{
public:
B() {}
void bar()
{
cout << "This is B. I am at the address " << this << endl;
global_a->foo(this);
}
};
int main()
{
global_a = new A(); …Run Code Online (Sandbox Code Playgroud) c++ pointers multiple-inheritance memory-address visual-studio-2013
随着"地址"运算符一元&.我可以知道结构的起始地址.
struct Point {
int* data;
int x;
int y;
};
struct Point offCenter = { 1, 1 };
struct Point* offCentreAddress_start = &offCenter ;
Run Code Online (Sandbox Code Playgroud)
如何确定结束地址(offCenterAddress_end)?
我们有一种机制可以监控捕获引用地址的加载和存储指令.我想对地址进行分类,无论它们属于堆栈,堆还是分配静态变量的区域.有没有办法以编程方式进行此分类?
我最初的想法是在进程开始运行时立即执行一个带有小内存请求(1?)的malloc(),这样我就可以捕获堆的"基地址"(或起始地址).这样,我可以区分静态分配的那些变量和其余的变量.对于那些不属于静态区域的引用(那些是堆和堆栈),我怎么能区分它们?
一些小测试显示以下简单代码(在Linux 3.18/x86-64中运行,使用gcc 4.8.4编译)
#include <stdio.h>
#include <stdlib.h>
int x;
int foo (void)
{
int s;
int *h = malloc (sizeof(int));
printf ("x = %p, *s = %p, h = %p\n", &x, &s, h);
}
int main (int argc, char *argv[])
{
foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
显示了地址空间的一些随机化(不是在静态变量中,而是在剩余部分 - 堆和堆栈中),这可能会增加一些不确定性,但可能是一种找到这些地区的限制的方法.
我学习计算机工程,这里的老师总是告诉我们定义这样的μC地址:
#define FIO0DIR (* (unsigned int *) 0x2009C000) //GPIO direction register from the lpc1769
但他们从未真正解释过为什么或正在发生什么.
所以我的问题是:为什么演员阵容呢?