我收到分段错误,但不了解分段错误发生的位置

I am receiving a segmentation fault error yet do not understand where the segmentation fault is occuring

本文关键字:错误 分段 位置 不了解      更新时间:2023-10-16

我相信错误发生在第 16 行之前的某个地方,编译后运行时不显示第一个 cout 语句。我最困惑的一点是,甚至没有显示 main 中的第一个 cout 语句。错误可能是从我没有注意到的地方开始的,还是在我的包含语句中的某个地方开始的?我在这里不知所措,因为在真正运行任何代码之前出现 seg 错误似乎很奇怪,尤其是在 main 中。

2 #include<iostream>
3 #include<iomanip>
4 #include<sstream>
5 #include<fstream>
6 using namespace std;
8 void Show_Menu(int);
9 string* getScreen(int);
13
14 int main()
15 {
16     cout <<"Thank You for Choosing Taco Bell";
17     string* menu = nullptr;
18     menu = getScreen(1);
19     int input = 1;
20     Show_Menu(input);
21     return 0;
22 };
23
24 string* getScreen( int input)
25 {
26     string taco_burrito[] = {"Tacos and Burritos","Beef_Burrito_Supreme", "Bean_Burrito", "Beefy_Five_Layer_Burrito", "Shredded_Chicken_Burrito", "Seven_Layer_Burrito", "Taco", "Soft_ta    co", "Shredded_Chicken_Soft_Taco", "Taco_Supreme", "Soft_Taco_Supreme", "Grilled_Steak_Soft_Taco", "Nacho_Cheese_Doritos_Locos_Taco" };
27     string special_items[] = {"Special Items","Cheesy_Roll_Up", "Mexican_Pizza", "Chicken_Quesadilla", "Beef_Chalupa", "Chicken_Power_Bowl", "Cheesy_Gordita_Crunch", "Crunchwrap_Supreme    ", "Beef_Quesarito", "Beefy_Nacho_Griller", "Fiesta_Taco_Salad"};
28     string nacho_sides_desserts[] = {"Nachos And Desserts","Chips_And_Nacho_Cheese", "Chips_And_Guacamole", "Nachos_Supreme", "Nachos_Bell_Grande", "Chips_And_Pico", "Pintos_And_cheese"    , "Fiesta_Potatos", "Black_Beans_And_Rice", "Black_Beans", "Rice", "Cinnamon_Twist", "Cinnabon_Two_Pack", "Cinnabon_Twelve_Pack"};
29     string dollar_cravings[] = { "Dollar Cravings","Beefy_Frito_Burrito", "Cheesy_Bean_Rice", "Spicy_Potato_Soft_Taco", "Shredded_Chicken_Quesadilla_Melt", "Spicy_Tostada", "Cheesy_Roll    _Up", "Triple_Layer_Nachos", "Cinnamon_Twist", "Cinnabon_Two_Pack"};
30         switch(input){
31             case 1:
32                 return taco_burrito;
33                 break;
34             case 2:
35                 return special_items;
36                 break;
37             case 3:
38                 return nacho_sides_desserts;
39                 break;
40             case 4:
41                 return dollar_cravings;
42             default:
43                 cout << "Invalid Entry" <<endl;
44             }
45 };
46
47 void Show_Menu(int input = 1)
48 {
49     string* screen;
50     screen = getScreen(input);
51     cout <<"Current Screen is: " << screen[0] << endl;
52     int size;
53     size = sizeof(screen);
54     for(int i =1; i < size; i++)
55     {
56         cout << i << ". " << screen[i] << endl;
57     }
58 };

几个问题:

  • cout缓冲其输出。 这意味着错误可能发生在第一个cout语句之后,但由于cout尚未刷新到屏幕,因此您看不到它。 如果您希望cout立即打印到屏幕上,则应以<< std::endl结束该行。 否则,请使用cerr,它不会缓冲输出,会自动打印到屏幕上。
  • 正如@Eljay报告的那样,getScreen返回指向已销毁对象的指针。 如果要返回字符串的动态长度数组,则最好将函数签名更改为vector<string> getScreen(int input)

在"string* getScreen( int input("函数中,"taco_burrito"是一个局部变量,将存储在堆栈中。所以当线程离开时,它将被定性,这意味着你不能把它传递给其他变量。 如果你想使用"taco_burrito[]"和其他数组,你可以把它们放在"main"之外的代码之上,也许你想使用"constant"使它们不变。 我同意你看不到cout,因为cout缓冲区不会大惊小怪。你最好使用它以endl结尾。 如果它对您有帮助,我很高兴!