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.

中的指针无效