我有以下代码段:
$scope.showPosition = function (position) {
// ...
}
$scope.getLocation = function () {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition($scope.showPosition, $scope.showError);
}
else {
$scope.error = "Geolocation is not supported by this browser.";
}
}
我不明白,为什么我的指针不仅包含size_t size = 5;
std::vector<char> container(size, 'd');
std::copy(container.begin(), container.begin() + size,
std::ostream_iterator<char>(std::cout, " ")); // d d d d d
auto ptr = containter.data();
//ptr == dddddTRASHTRASH why??
char* str_ = new char[size + 1];
memcpy(str_, container.data, size * sizeof(char));
std::cout << str_ << std::endl; // dddddTRASHTRASHTRASH!!!!
。如何使用d
5
的{{1}}符号创建指针?
答案 0 :(得分:7)
因为container.data()
不是以null结尾的,所以指针不指向C风格的字符串。你已经在那里放了5 d
,但在那些字节之后只是未分配的内存。当您尝试对其进行流式处理时,它将继续运行,直到其中一个未分配的字节恰好是\0
。
为了有效地打印const char*
,必须以\0
结尾。您可以通过以下方式验证:
size_t size = 5;
std::vector<char> container(size, 'd');
container.push_back('\0');
std::cout << container.data();
str_
也是如此。您为null终止符分配了足够的内存,您只需添加它:
char* str_ = new char[size + 1];
memcpy(str_, container.data, size * sizeof(char));
str_[size] = '\0'; // need this
答案 1 :(得分:1)
...为什么我的指针不仅包含
d
好吧,正如Barry所说,你的指针实际上只包含d
s
关于你的第二个问题,
如何使用RAII创建带有5个d符号的指针?
您可以使用unique_ptr:
#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>
#include <memory>
int main()
{
size_t size = 5;
std::vector<char> container(size, 'd');
std::copy(container.begin(), container.begin() + size,
std::ostream_iterator<char>(std::cout, " ")); // d d d d d
std::cout << '\n';
std::unique_ptr<char[]> p(new char[size]);
for(size_t i=0; i<size; ++i)
p[i] = 'd';
for(size_t i=0; i<size; ++i)
std::cout << p[i] << ' ';
std::cout << '\n';
}
(顺便说一下,你的代码片段没有编译)