std::transform 不适用于静态分配的字符串
std::transform not working for statically allocated string
有人可以帮我理解为什么这不起作用吗?
#include <vector>
#include <algorithm>
using namespace std;
struct person {
int age;
char name[30];
};
int main()
{
vector<person> persons(2);
vector<char*> names(2);
persons[0].age = 1;
strcpy_s(persons[0].name, "mike");
persons[1].age = 11;
strcpy_s(persons[1].name, "pol");
transform(persons.begin(), persons.end(), names.begin(),
[](person p) -> char* {return p.name; });
// ... names gets the same wrong pointer for both elements
}
[编辑删除不必要的错误猜测]
在这个 lambda 中:
[](person p) -> char* { return p.name; });
您正在制作 persons
中每个元素的副本,然后 return 创建指向副本成员的指针。一旦你从 lambda 中 return ,这就会悬垂,当你稍后使用指针时调用未定义的行为..
相反,您可以 return 指向引用成员的指针:
[](person & p) -> char* { return p.name; });
// ^
只要persons
指向相同的底层内存,这些指针就有效。以使指向它的指针无效的方式修改 persons
显然会使 names
.
中的指针无效
有人可以帮我理解为什么这不起作用吗?
#include <vector>
#include <algorithm>
using namespace std;
struct person {
int age;
char name[30];
};
int main()
{
vector<person> persons(2);
vector<char*> names(2);
persons[0].age = 1;
strcpy_s(persons[0].name, "mike");
persons[1].age = 11;
strcpy_s(persons[1].name, "pol");
transform(persons.begin(), persons.end(), names.begin(),
[](person p) -> char* {return p.name; });
// ... names gets the same wrong pointer for both elements
}
[编辑删除不必要的错误猜测]
在这个 lambda 中:
[](person p) -> char* { return p.name; });
您正在制作 persons
中每个元素的副本,然后 return 创建指向副本成员的指针。一旦你从 lambda 中 return ,这就会悬垂,当你稍后使用指针时调用未定义的行为..
相反,您可以 return 指向引用成员的指针:
[](person & p) -> char* { return p.name; });
// ^
只要persons
指向相同的底层内存,这些指针就有效。以使指向它的指针无效的方式修改 persons
显然会使 names
.