[英]Stack Smashing/BackTrace
我写了一些代码,应该采用一个char数组,并使它看起来像计算机在键入文本。 很简单,对不对? 但是当我运行它时,Terminal告诉我:
*** stack smashing detected ***: ./TYPE terminated
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x45)[0xb759aeb5]
/lib/i386-linux-gnu/libc.so.6(+0x104e6a)[0xb759ae6a]
./TYPE[0x80486a9]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb74af4d3]
./TYPE[0x8048591]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:01 1580147 /home/jeremy/Desktop/programming/cpp/Jumping into C++/TYPE
08049000-0804a000 r--p 00000000 08:01 1580147 /home/jeremy/Desktop/programming/cpp/Jumping into C++/TYPE
0804a000-0804b000 rw-p 00001000 08:01 1580147 /home/jeremy/Desktop/programming/cpp/Jumping into C++/TYPE
08a30000-08a51000 rw-p 00000000 00:00 0 [heap]
b7449000-b744b000 rw-p 00000000 00:00 0
b744b000-b7467000 r-xp 00000000 08:01 4195157 /lib/i386-linux-gnu/libgcc_s.so.1
b7467000-b7468000 r--p 0001b000 08:01 4195157 /lib/i386-linux-gnu/libgcc_s.so.1
b7468000-b7469000 rw-p 0001c000 08:01 4195157 /lib/i386-linux-gnu/libgcc_s.so.1
b7469000-b7493000 r-xp 00000000 08:01 4198259 /lib/i386-linux-gnu/libm-2.15.so
b7493000-b7494000 r--p 00029000 08:01 4198259 /lib/i386-linux-gnu/libm-2.15.so
b7494000-b7495000 rw-p 0002a000 08:01 4198259 /lib/i386-linux-gnu/libm-2.15.so
b7495000-b7496000 rw-p 00000000 00:00 0
b7496000-b763a000 r-xp 00000000 08:01 4198264 /lib/i386-linux-gnu/libc-2.15.so
b763a000-b763c000 r--p 001a4000 08:01 4198264 /lib/i386-linux-gnu/libc-2.15.so
b763c000-b763d000 rw-p 001a6000 08:01 4198264 /lib/i386-linux-gnu/libc-2.15.so
b763d000-b7640000 rw-p 00000000 00:00 0
b7640000-b7718000 r-xp 00000000 08:01 8786914 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16
b7718000-b7719000 ---p 000d8000 08:01 8786914 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16
b7719000-b771d000 r--p 000d8000 08:01 8786914 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16
b771d000-b771e000 rw-p 000dc000 08:01 8786914 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16
b771e000-b7725000 rw-p 00000000 00:00 0
b773e000-b7742000 rw-p 00000000 00:00 0
b7742000-b7743000 r-xp 00000000 00:00 0 [vdso]
b7743000-b7763000 r-xp 00000000 08:01 4198254 /lib/i386-linux-gnu/ld-2.15.so
b7763000-b7764000 r--p 0001f000 08:01 4198254 /lib/i386-linux-gnu/ld-2.15.so
b7764000-b7765000 rw-p 00020000 08:01 4198254 /lib/i386-linux-gnu/ld-2.15.so
bffc0000-bffe1000 rw-p 00000000 00:00 0 [stack]
abcdefghijklmnopqrstuvwxyzAborted (core dumped)
我是C ++的新手(我有C背景),我不知道堆栈粉碎或回溯是什么。 如果可以帮助我,对您有很大帮助! 这是代码:
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <unistd.h>
using namespace std;
void type(char letters[]);
int main(){
char letters[27] = "abcdefghijklmnopqrstuvwxyz";
system("clear");
type(letters);
return 0;
}
void type(char letters[]){
unsigned int wait = 30000000;
system("clear");
for(int i = 0; letters[i] != '\n'; i++){
usleep(wait)
cout << letters[i];
}
}
C ++中的字符串应以null终止,即它们的最后一个字符是\\0
。 在您的代码中,循环不会在字符串letters
的末尾终止,因为您正在寻找\\n
字符,该字符实际上不存在于该字符串中。
第一次修复
在循环中使用要查找的字符终止字符串:
char letters[28] = "abcdefghijklmnopqrstuvwxyz\n";
二次修复
通过查找实际上确实存在的字符串结尾字符\\0
来终止循环:
for(int i = 0; letters[i] != '\0'; i++)
第三修正
使用适当的字符串长度检查作为循环终止条件:
int len = strlen(letters);
for(int i = 0; i < len; i++)
或这三者的任意组合。
通常,将字符串声明为固定大小的数组永远不是一个好主意,因此请使用const char *letters = "...";
代替。
您陷入无限循环
您正在寻找不存在的'\\n'
。 您应该寻找空字符\\0
for(int i = 0; letters[i] != '\0'; ++i){
usleep(wait)
cout << letters[i];
}
您可以在此处使用两种解决方案之一。
1)您可以在循环中包含\\ n,但这必须在数组本身中,并且数组大小必须增加1到字母[28]。
2)您保留声明的数组,但是for循环将是
for(int i = 0; letters[i]; i++){
cout << letters[i];
}
第二种解决方案,您不必更改数组大小,循环将一直持续到数组结尾
除了其他评论者指出的字符串结尾问题外,您的代码可能也不会如您所愿,因为您正在使用cout。 该输出流将缓冲所有内容,直到您仍然发送换行符为止,这样,在打印最终换行符时,您的“类型”将立即全部显示。
通过打印到cerr或在应该打印每个字符后冲洗cout,可以一次获得一个字符的效果。
如果使用的是C ++,则应使用std::string
。 这将为您跟踪长度,但是您也可以使用迭代器。
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <unistd.h>
using namespace std;
void type(const string &);
int main(){
string letters = "abcdefghijklmnopqrstuvwxyz";
system("clear");
type(letters);
return 0;
}
void type(const string &letters)
{
unsigned int wait = 30000000;
system("clear");
for(string::const_iterator it = letters.begin(); it != letters.end(); it++)
{
usleep(wait)
cout << *it;
}
}
虽然,如果您愿意,仍可以按索引访问字符串的字符,例如:
void type(const string &letters)
{
unsigned int wait = 30000000;
system("clear");
for(size_t i = 0; i < letters.length(); i++)
{
usleep(wait)
cout << letters[i];
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.