指向 int 类型的指针在C++中无法正确协作

Pointer to type int doesn't cooperate properly in C++

本文关键字:协作 C++ 类型 int 指针 指向      更新时间:2023-10-16

我现在已经在谷歌上搜索了很多,但仍然找不到任何解决方案。。。问题是,我正在尝试制作一个程序,将不同的点存储在坐标系中,并将它们显示在屏幕上(它稍后会变成一种图形,但我还没有完全做到)。但不幸的是,我遇到了一些问题
我决定将所有的点依次存储在字符串类型的地址中,如下所示:

string p;
string * pointer = &p;
p = "5, 3";
*(&p+1) = "6, 4";
*(&p+2) = "7, 5";
cout << *pointer << *(pointer+1) << *(pointer+2);

或者这个:

string p;
string * pointer = &p;
p = "5, 3";
*(pointer+1) = "6, 4";
*(pointer+2) = "7, 5";
cout << *pointer << *(pointer+1) << *(pointer+2);

但每当我到达第4行或第5行时,我都会在memcpy程序集中的这一行出现错误:

mov     [edi],al        ;U - write second byte to destination

显然这不起作用
我开始怀疑这与指针指向字符串类型的地址有关,该地址由char数组组成,但我不确定为什么,也不确定如何。。。如果现在是这样,为什么可以使用字符串指针?

无论如何,任何解决方案/解释都是值得赞赏的。我过去很少使用指针,所以如果我遗漏了一些明显的东西,请原谅。但如前所述,我已经试着寻找了,但什么也找不到。

您的第一个代码甚至不会编译。

您的第二个代码尝试将值存储到内存中可能位于p之后的std::string对象中。但是在内存中p之后没有std::string对象。任何将任何内容"存储"到那些不存在的对象中的尝试都会导致未定义的行为。

如果您将p声明为阵列

string p[3];
string * pointer = p;
*pointer = "5, 3";     // same as `p[0] = "5, 3"`
*(pointer+1) = "6, 4"; // same as `p[1] = "6, 4"`
*(pointer+2) = "7, 5"; // same as `p[2] = "7, 5"`
cout << *pointer << *(pointer+1) << *(pointer+2);

则代码的第二版本将安全地将字符串存储到该数组的连续元素中。

但你现在所拥有的一切都没有意义。现在还不清楚你想做什么。

不要使用指针,它们很难,而且你对它们的工作方式有一些严重的(奇怪的)误解。只需使用矢量。

#include <vector>
struct Point
{
    Point(int xx, int yy) : x(xx), y(yy) {}
    int x;
    int y;
};
std::vector<Point> p;
p.push_back(Point(5,3));
p.push_back(Point(6,4));
p.push_back(Point(7,5));

我定义了一个简单的Point类,因为如果您正在编写一个关于点的程序,这似乎也是合理的。但是,如果您真的想将点存储为字符串,那么用std::vector<std::string>替换std::vector<Point>

为什么不简单地这样做:

string p1 = "5, 3";
string p2 = "6, 4";
string p3 = "7, 5";
cout << p1 << p2 << p3;

如果你有更多的点,你可以使用这样的向量:

vector<string> points;
points.push_back("5, 3");
points.push_back("6, 4");
points.push_back("7, 5");
cout << points[0] << points[1] << points[2];

顺便说一下,为什么要将坐标存储在字符串中而不是浮点数组中?

首先,获取std::string对象的地址并递增它-std::字符串不是(w)char[]。它确实连续存储数据,但也以实现定义的方式存储一些元数据。因此,你正在重写恰好在内存中的东西,并且你正在用与它的类型不匹配的东西重写它,因此它甚至不会编译。

在操作std::字符串时,可以使用运算符[]来访问字符串的实际数据。

也就是说,我很确定您不想存储字符串的随机指针。理想情况下,使用T x, y;数据成员创建一个类Point<T>来存储坐标。