繁体   English   中英

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
}

[编辑以消除不必要的错误猜测]

在这个拉姆达:

[](person p) -> char* { return p.name; }); 

你在做每一个元素的副本persons ,然后返回一个指针到副本中的一员。 一旦您从 lambda 返回,这就会悬空,当您稍后使用指针时调用未定义的行为..

相反,您可以返回一个指向引用成员的指针:

[](person & p) -> char* { return p.name; });
       // ^

只要persons指向相同的底层内存,这些指针就是有效的。 以一种使指向它的指针无效的方式修改persons显然会使names的指针无效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM