分段错误和可用内存,但没有使用指针

Segmentation error and free memory though no pointer used

本文关键字:指针 内存 错误 分段      更新时间:2023-10-16

我正在尝试一个问题来打印最近的素数ASCII,但没有输出。问题是什么以及如何解决?

法典:

#include <iostream>
using namespace std;
bool isPrime(int p) {
bool result = true;
for (int i = 2; i <= p / 2; i++) {
if (p%i == 0) {
result = false;
break;
}
}
return result;
}
int goLeft(int l) {
if (l != 65) {
for (int i = l; i>65; i--) {
if (isPrime(i))
return i;
}
return 0;
}
else {
return 0;
}
}
int goRight(int r) {
if (r != 122) {
for (int i = r; i<122; i++) {
if (isPrime(i))
return i;
}
return 0;
}
else {
return 0;
}
}
int performAll(int l, int r, int p) {
int diffLeft = 0, diffRight = 0;
if (l == 0 && r != 0) {
diffLeft = diffRight = r;
}
else if (l != 0 && r == 0) {
diffRight = diffLeft = l;
}
else if (l == 0 && r == 0) {
diffRight = diffLeft = 0;
}
else {
diffLeft = p - l;
diffRight = r - p;
}
if (diffLeft > diffRight) {
return r;
}
else if (diffLeft < diffRight) {
return l;
}
else {
if (l<r) {
if (l != 0) {
return l;
}
else {
return r;
}
}
else if (l>r) {
if (r != 0) {
return r;
}
else {
return l;
}
}
}
return 0;
}
int main()
{
int T, N;
int left = 0, right = 0, ss = 0;
cin >> T;
string S, R;
while (T>0) {
cin >> N;
cin >> S[j];
for (int i = 0; i<N; i++) {
cout << "i-" << i << endl;
ss = S[i];
if ((ss >= 65 && ss <= 90) || (ss >= 97 && ss <= 122)) {
if (isPrime(ss)) {
R[i] = S[i];
}
else {
left = goLeft(ss);
right = goRight(ss);
R[i] = performAll(left, right, ss);
}
}
else {
if (ss<65) {
left = 0;
right = 67;
}
else if (ss>122) {
left = 113;
right = 0;
}
else {
left = goLeft(ss);
right = goRight(ss);
}
R[i] = performAll(left, right, ss);
}
cout << R[i];
}
T--;
}
return 0;
}

输入:

1

375 AvfmaLgLRpQadLyThsxVzkUqbFOdxfbLGdpBWOwmAnflENlYFbdhNHerHVtZkaPLgMtNQovVHpwGfHJdXXWAhYrhwXKPxtnpxCIsaXVAkcxTpVprFNeOVcnSEsgIvfqXPRSUASSDCvAGrFJCDbzGLFhrMYWALElChmurLrEeQttIWctyhQXzZUVAYuuCIZecBJbXMxlMHFbZxJRTSZJmZAwCggGabVsovqBrdmmbCTaIHDfUunLFntfGzodKqoAKwCassKMDybethRaQgegsOawfNCNrIAkECEKpbwElhvWtlZBEZqJQpEkzpiSjrqZZIHbszUxwuWreXkxFKxSAiKoemIqETGVxcCjweKhbyXxhVKCbNTQBKgHD

Your Code's Output

"你的代码没有打印任何东西。">

cin>>S[j];

正在越界访问S,因为S是空的。您可能希望将其替换为例如:

char ch;
cin >> ch;
S += ch;

或者只是一次读取整个字符串,而无需先输入长度:

cin >> S;

我还收到一个编译器错误"控件可能达到非无效函数的末尾"performAll。 即它缺少返回语句。

你正在践踏std::string分配的内存。 当你到达

cin>>S[j];

S是空的,因为它是默认构造的。 如果索引对写入无效,并且对于空字符串没有有效的可写索引,则尝试使用operator[]向其添加数据是未定义的行为。