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] = &a
和 demo[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 的复制构造函数。它从不运行析构函数来清理那里不存在的那个对象。
所以标准容器很棒,但您真的必须首先了解一些关于它们的知识,否则您只是在乞求搬起石头砸自己的脚。
我正在尝试创建一个指针数组。初始化每个指针时,我不能使用 (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] = &a
和 demo[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 的复制构造函数。它从不运行析构函数来清理那里不存在的那个对象。
所以标准容器很棒,但您真的必须首先了解一些关于它们的知识,否则您只是在乞求搬起石头砸自己的脚。