1

如果我有一个可以容纳 100 个字符的 std::vector 缓冲区,并且我调用一个 C 函数,它将写入一个 NULL 终止的字符串,就像writestring(&buffer[0], buffer.size())我读过的那样,如果缓冲区中已经有数据,那就没问题了。但如果向量为空,则行为未定义。我该如何解决这个问题,我可以向缓冲区写入一些东西,比如“qwerty”,然后调用 writestring() 以便我知道行为总是被定义的吗?你们在调用 C 函数时使用什么样的存储?我刚刚阅读了有关 .data 的信息,但我不知道它有多常见或可移植。

谢谢

4

3 回答 3

3

C++

std::vector<char> v;
v.resize(100);
writestring(&v[0], v.size());

C

void writestring(char*p, size_t len) {
  strncpy(p, "Doofi", len);
}

如果向量为空,则行为未定义。我该如何解决?

通过传递一个非空缓冲区。使用该.resize()方法快速填充向量,或将其构造为最初的正确大小:std::vector<int> v(100);.

你们在调用 C 函数时使用什么样的存储?

std::vector是这个应用程序的一个不错的选择。对于 C,它看起来就像一个数组或 malloc 的区域。但是,要意识到 C 的指针只有在向量没有被重新分配或销毁时才有效。

于 2012-05-08T20:08:51.310 回答
3

首先调整向量的大小:

buffer.resize(100);
writestring(buffer.data(), buffer.size());  // buffer.data() == &buffer[0]

或者,一次性构建所需大小的缓冲区:

std::vector<char> buffer(100);
于 2012-05-08T20:10:04.583 回答
0

我认为您应该测试缓冲区是否为空。如果为空,则不要调用 writestring。

于 2012-05-08T21:10:43.277 回答