C++ 指针运算 "lvalue required as left operand of assignment" 错误

C++ pointer arithmetic "lvalue required as left operand of assignment" error

我正在尝试创建一个指针数组。初始化每个指针时,我不能使用 (ptr + 1) 来分配一些东西。

示例代码:

int* demo = (int*) malloc(5*sizeof(int));
int a = 1;
int b = 2;
int* pa = &a;
int* pb = &b;
demo = pa;
demo+=1;
demo = pb;

会起作用,而

int* demo = (int*) malloc(5*sizeof(int));
int a = 1;
int b = 2;
int* pa = &a;
int* pb = &b;
demo = pa;
(demo + 1) = pb;

不会。它说错误:"lvalue required as left operand of assignment" 在最后一行。

有什么方法可以使用(因为没有更好的术语)'temporarily incremented pointer',或者我是否需要只存储原始指针并通过递增指针来遍历我的数组?

I'm trying to create an array of pointers.

好吧,int *demo 创建单个指针,而不是它们的数组。

如果你想要一个指针数组,你需要做这样的事情:

int *demo[5];
int a = 1;
int b = 2;
demo[0] = &a;
demo[1] = &b;

由于x[y]等同于指针的*(x + y),最后两行也可以写成

*(demo + 0) = &a;
*(demo + 1) = &b;

另一方面,如果您只是想动态分配一个整数数组,您可以这样做:

int *demo = new int[5];
demo[0] = 1;
demo[1] = 2;
// Or (as above):
// *(demo + 0) = 1;
// *(demo + 1) = 2;
...
delete[] demo;

但我建议使用标准容器(例如 std::vector)而不是手动调用 new[]

所以你先分配内存,分配给demo。你接下来将 demo 瞄准 &a,然后 LEAK MEMORY。原始值,即 malloc 返回的值,被 &a 覆盖,这可能不在返回指针附近。堆与堆栈。

对于每个 malloc,必须有一个 free。对于每个 new,必须有一个 delete。您的代码没有 free,因此不干净。它只能被神圣的……呃随便什么。只是不要忘记 free 你的记忆。

一个"L-value"表示"a value that is valid on the LEFT(thus the L) of an assignment"。 demo + 1 创建一个临时值,该值会立即消失。

指针和数组在 C/C++ 中完全可以互换。看起来您想做的是 demo[0] = &ademo[1] = &b... 将值写入演示中分配和存储的区域。您并不是要覆盖 demo 本身,以及 demo 本身旁边的任何内容(恰好是 a),具有 64 位值(这也会踩到 b)。

您还将 int* 个值(一个 64 位指针)写入一个整数数组(在大多数但不是所有平台上都是 32 位值)。

考虑到这是 C++,您可能会更高兴:

    std::vector<int*> demo;
    int a = 1;
    int b = 2;
    demo.push_back(&a);
    demo.push_back(&b);

您让 std::vector 完成所有分配和释放工作。没有混乱,没有大惊小怪,没有资源泄漏。

对于向量,您必须牢记一些事项。 "room for" 和 "size" 不一样。

    std::vector<int*> badIdea();
    badIdea.reserve(5); // Preallocating is good, right?  room for 5 (or maybe a bit more).
    assert(badIdea.size() == 0);
    badIdea[0] = nullptr; // bad news. Writing into the memory but not actually changing the vector's idea of how big it is.
    assert(badIdea.size() == 0);
    badIdea.push_back(&someInt);
    assert(badIdea.size() == 1); // so &someInt was written over that nullptr

如果您使用的是非平凡析构函数的向量,这将变得更糟糕。

    std::vector<someClass> reallyBadIdea;
    reallyBadIdea[0].someFunction(); // the object at [0] hasn't been constructed yet
    reallyBadIdea.push_back(stuff);

万一 someFunction() 没有在你面前炸毁,如果 someFunction() 分配了一些要在析构函数中释放的东西,会发生什么。因为 vector 认为 reallyBadIdea[0] 中没有对象,它只是在 stuff 上运行 someClass 的复制构造函数。它从不运行析构函数来清理那里不存在的那个对象。

所以标准容器很棒,但您真的必须首先了解一些关于它们的知识,否则您只是在乞求搬起石头砸自己的脚。