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