C++ 从向量中获取超出范围的元素

C++ 从向量中获取超出范围的元素,c++,vector,C++,Vector,我正在做一些测试,并解决了这个问题: #include <stdio.h> #include <vector> #include <string> class Person{ public: std::string name; Person(const char *name): name(name){ printf("c-tor for %s\n", name); }; v

我正在做一些测试,并解决了这个问题:

#include <stdio.h>

#include <vector>
#include <string>

class Person{
public:
    std::string name;

    Person(const char *name):
        name(name){
            printf("c-tor for %s\n", name);
        };

    void print(){
        printf(">> %s\n", name.c_str());
    };
};

int main(){
    std::vector<Person> v;

    v.push_back("Ivan");
    v.push_back("Stoyan");
    v.push_back("Dragan");

    v[10].print();
}
#包括
#包括
#包括
班主任{
公众:
std::字符串名;
人员(常量字符*姓名):
姓名(姓名){
printf(“用于%s\n的c-tor”,名称);
};
作废打印(){
printf(“>>%s\n”,name.c_str());
};
};
int main(){
std::向量v;
v、 推回(“伊万”);
v、 推回(“斯托扬”);
v、 推回(“德拉根”);
v[10].print();
}
如果我使用
std::cout
,它会崩溃。但是,如果我使用
printf
,它会打印:

伊万的任务大纲
斯托扬的任务大纲
德拉甘的任务大纲
>>(空)

这仅仅是偶然和巧合的结果吗

可移植程序不应使用参数n调用此函数 这超出了范围,因为这会导致未定义的行为

这仅仅是偶然和巧合的结果吗

你已经用报价说明了原因

可移植程序不应使用参数n调用此函数 这超出了范围,因为这会导致未定义的行为

v.size()
小于
11
时访问
v[10]
是未定义的行为,因此您的程序可能会崩溃或给出意外(有时看起来是正确的)输出

cout
可能以与访问
std::string::c_str
不同的方式打印
std::string
,因此
cout
printf
可能给出不同的结果

这仅仅是偶然和巧合的结果吗

你已经用报价说明了原因

可移植程序不应使用参数n调用此函数 这超出了范围,因为这会导致未定义的行为

v.size()
小于
11
时访问
v[10]
是未定义的行为,因此您的程序可能会崩溃或给出意外(有时看起来是正确的)输出

cout
可能以与访问
std::string::c_str
不同的方式打印
std::string
,因此
cout
printf
可能给出不同的结果

这仅仅是偶然和巧合的结果吗

你已经用报价说明了原因

可移植程序不应使用参数n调用此函数 这超出了范围,因为这会导致未定义的行为

v.size()
小于
11
时访问
v[10]
是未定义的行为,因此您的程序可能会崩溃或给出意外(有时看起来是正确的)输出

cout
可能以与访问
std::string::c_str
不同的方式打印
std::string
,因此
cout
printf
可能给出不同的结果

这仅仅是偶然和巧合的结果吗

你已经用报价说明了原因

可移植程序不应使用参数n调用此函数 这超出了范围,因为这会导致未定义的行为

v.size()
小于
11
时访问
v[10]
是未定义的行为,因此您的程序可能会崩溃或给出意外(有时看起来是正确的)输出


cout
可能以与访问
std::string::c_str
不同的方式打印
std::string
,因此
cout
printf
可能会给出不同的结果。

未定义的行为是未定义的。所以要求看似有用的东西是没有用的,只是没有定义而已。行为取决于您使用的编译器。它不能“正确”工作。因为这是未定义的行为(正如你引用自己的话),所以没有“正确”的方法。未定义的行为意味着任何事情都可能发生。它甚至可以像预期的那样工作,这(讽刺的是)有时会非常令人沮丧:您可能首先认为它可以工作,然后您的程序崩溃或行为非常奇怪,并且您没有找到问题的根源。。。简而言之,尽一切办法避免未定义的行为,即使它一开始似乎有效。未定义的行为是未定义的。所以要求看似有用的东西是没有用的,只是没有定义而已。行为取决于您使用的编译器。它不能“正确”工作。因为这是未定义的行为(正如你引用自己的话),所以没有“正确”的方法。未定义的行为意味着任何事情都可能发生。它甚至可以像预期的那样工作,这(讽刺的是)有时会非常令人沮丧:您可能首先认为它可以工作,然后您的程序崩溃或行为非常奇怪,并且您没有找到问题的根源。。。简而言之,尽一切办法避免未定义的行为,即使它一开始似乎有效。未定义的行为是未定义的。所以要求看似有用的东西是没有用的,只是没有定义而已。行为取决于您使用的编译器。它不能“正确”工作。因为这是未定义的行为(正如你引用自己的话),所以没有“正确”的方法。未定义的行为意味着任何事情都可能发生。它甚至可以像预期的那样工作,这(讽刺的是)有时会非常令人沮丧:您可能首先认为它可以工作,然后您的程序崩溃或行为非常奇怪,并且您没有找到问题的根源。。。简而言之,尽一切办法避免未定义的行为,即使它一开始似乎有效。未定义的行为是未定义的。所以要求看似有用的东西是没有用的,只是没有定义而已。行为取决于您使用的编译器。它不能“正确”工作。因为这是未定义的行为(正如你引用自己的话),所以没有“正确”的方法。未定义的行为意味着任何事情都可能发生。它甚至可以像预期的那样工作,这(讽刺的是)有时会非常令人沮丧:你可能首先认为它工作,然后你的程序cra