同样,我正在尝试制作一个简单的程序。它将读取某种类型的板,大小与RxC相同。板上的每个项目都是字母,用空格分隔。这是一个示例板:
A B C
D E F
G H I
之后,它将读取一个整数N,对于接下来的N行,读取一个字符串并根据给定的电路板逐个处理它们。但现在,我正面临着如何阅读它们的问题。这是代码:
#include<iostream>
using namespace std;
int r,c,el; char **arr;
int main()
{
char *tes;
int n;
//start reading the puzzle
cin >> r >> c; el=r;
cout << el << endl;
arr = new char * [3*(r+c)-6];
for(int i=0;i<r;i++)
{
arr[i] = new char[c+1];
for(int j=0;j<c;j++) cin >> arr[i][j];
arr[i][c] = '\0';
}
for(int i=0;i<el;i++) cout << arr[i] << endl;
cin >> n;
while(n>0)
{
n--;
cin >> tes;
cout << tes << endl;
}
}
我不知道这有什么问题,对我来说似乎没问题。但是,它总是会出现运行时错误。我正在使用最新的MinGW和gdb调试器。在gdb上我看到了类似
的内容“接收信号SIGSEGV。分段 故障“
,并出现0xC0000005错误。我真的不知道这里发生了什么。我已经尝试了iostream(cin&amp; cout)和cstdio(scanf,puts等)
P.S。:我全局声明变量,因为我将在main()函数的不同函数上处理它们。我将数组的“高度”的大小设置为(3 *(r + c)-6),而不是正常(r),因为我将使用相同的数组来存储另一个字符串。
答案 0 :(得分:3)
大小为R * C的电路板需要r*c
char
存储,而不是非常令人惊讶。我不明白你为什么要分配这么多步骤。一个char* board = new char[r * c];
应该这样做,然后跟踪您正在阅读的数组中的位置。
答案 1 :(得分:3)
除了其他人已经注意到的问题之外,你还没有为tes
分配任何内存 - 它只是一个悬空指针。
变化:
char *tes;
到,例如:
char tes[80];
答案 2 :(得分:2)
分段错误通常意味着您正在尝试访问尚未分配的内存,例如
char* mystr = (char*)malloc(3*sizeof(char));
mystr[4] = 0.0;
会(很可能)导致seg错误,因为你正在访问你没有分配的内存(mystr从0 - 2开始)。
您确定要正确分配内存吗?我不知道为什么你有3 *(r + c)-6。
答案 3 :(得分:0)
继unwind
的答案之后,您的数组的大小为3*(r+c)-6
,但是您正在循环使用值i = 0; i < r;
,这取决于值可能超出范围(加上它)毫无意义)。