我对C++中的垃圾收集器很好奇。我可以理解他们可以通过使用他们的分配方法来控制内存分配。就像Boehm
#include "gc.h"
#include <assert.h>
#include <stdio.h>
int main()
{
int i;
GC_INIT(); /* Optional on Linux/X86; see below. */
for (i = 0; i < 10000000; ++i)
{
int **p = (int **) GC_MALLOC(sizeof(int *));
根据我对C的理解,在尝试初始化时,似乎应该使用malloc( size ),例如,一个数组的大小直到运行时才知道。
但是,我想知道为什么函数malloc()返回指向变量位置的指针,以及为什么需要这样做。
基本上,为什么C不把它全部隐藏起来,这样每当你做这样的事情:
// 'n' gets stdin'ed from the user
...
int someArray[n];
for(int i = 0; i < n; i++)
someArray[i] = 5;
您可以不需要调用malloc()或其他函数就可以这
对于C中的数组指针,我有一个看似简单的问题。我正在尝试理解用C编写的一部分代码,这样我就可以将它移植到C#。数据类型和函数定义如下:
/* header file */
/* definition of data_t type */
typedef unsigned short uint16_t;
typedef uint16_t data_t;
/* the function the type data_t is used */
#define FOO(d) do {
d[0] = 1;
d[1] = 2;
} while (0)
/* source file */
/* the
创建变量时,例如:
int x = 5;
它会存储在内存中的某个地方,很酷。
但是,当我通过执行以下操作更改变量的值时:
x = 10;
内存中发生了什么?
x的新值是否会覆盖使用相同内存地址的旧值?
或者新值被存储在新的内存地址中,然后旧地址被删除?
当我遇到指针时,这个问题就出现了。似乎使用指针更改变量的值与使用另一个值定义变量是相同的。
这是我的代码(大部分是注释(lol)):
#include "iostream"
int main()
{
int x = 5; // declaring and defining x to be 5
int *xPoi
这实际上是一个普遍的问题,但现在我正在使用Go和C#。假设我们希望在Go中从用户的输入中赋值一个变量:
func main() {
var input float64
fmt.Scan(&input)
}
很明显,为什么我们需要一个内存位置来放置我们的新值。但是,为什么在像Java或C#这样的语言中,我们没有遵循相同的逻辑:
var input = Convert.ToInt32(Console.ReadLine());
// and not &input ...
在C++中,提到指针的类型是必要的。例如,
int a = 5;
int * p = &a;
在这里,“int*”中的“int”是必要的。我发现的原因是取消引用是必要的。要读取的字节及其解释)和指针算法。
然而,如果我写:-
int a = 5;
char * p = &a;
float * p2 = &a;
//etc
会显示错误,说明char*、float*等指针不能分配给int变量。好的..,所以编译器知道变量的类型,我想为它提供一个指针。这与普通变量不同,在普通变量中,编译器不知道我想要哪种类型。例如:-
int a = 5;
float b = 5;
doub
我想知道如果我有这样的东西,结构会被分配到内存中的什么地方。
typedef struct {
int c;
} A;
A * a = (A)* malloc(sizeof(A));
a -> c = 2;
C将被分配到堆区域,对吗?此外,如果我用以下命令释放内存
free(a);
C占用的内存区域发生了什么变化?
我有以下的类定义:
class A {...}
class B : public class A {...}
以及所有者类定义:
class C {
A* a;
public:
C (A* a) { this->a = a; }
}
然后,当我试图调用以下内容时,一切都很好:
B* b = new B();
C(b);
但是,我有以下所有者类定义:
class C {
std::unique_ptr<A> a;
public:
C(std::unique_ptr<A>& a) { this->a = std::mo