Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我会得到一个';运行时错误-SIGSEGV';在我的代码里?_C++_Arrays_Segmentation Fault_Runtime - Fatal编程技术网

C++ 为什么我会得到一个';运行时错误-SIGSEGV';在我的代码里?

C++ 为什么我会得到一个';运行时错误-SIGSEGV';在我的代码里?,c++,arrays,segmentation-fault,runtime,C++,Arrays,Segmentation Fault,Runtime,我有一些不可能的问题要问你!(或者他们是?;)) 您有长度为m的n二进制数。ith二进制数是Bi。此外,您还必须对它们执行q查询。索引是从零开始的,位的索引从左开始 查询类型为:a、i、j 如果a为: 0:在Bi和Bj之间执行逻辑与运算,并在结果中输出1s的数量 1:在Bi和Bj之间执行逻辑或运算,并在结果中输出1s的数量 2:在Bi和Bj之间执行逻辑异或运算,并输出结果中1s的数目 3:翻转Bi的j第位的值(即,如果该位等于1,则将该位设置为0,反之亦然) 注意:对于类型为0、1和2的查询

我有一些不可能的问题要问你!(或者他们是?;))

您有长度为
m
n
二进制数。
i
th二进制数是Bi。此外,您还必须对它们执行
q
查询。索引是从零开始的,位的索引从左开始

查询类型为:
a
i
j

如果
a
为:

  • 0
    :在Bi和Bj之间执行逻辑与运算,并在结果中输出
    1
    s的数量
  • 1
    :在Bi和Bj之间执行逻辑或运算,并在结果中输出
    1
    s的数量
  • 2
    :在Bi和Bj之间执行逻辑异或运算,并输出结果中
    1
    s的数目
  • 3
    :翻转Bi的
    j
    第位的值(即,如果该位等于
    1
    ,则将该位设置为
    0
    ,反之亦然)
注意:对于类型为
0
1
2
的查询,二进制数保持不变

<> P>也建议使用C++和java程序员的快速I/O。< /P>
输入格式:

第一行包含整数
n
m

接下来的
n
行包含长度为
m
的二进制数
i
th行包含二进制数Bi。
下一行包含一个整数
q

接下来的
q
行包含以下类型的查询:
a
i
j

输出格式:

在类型
0
1
2
查询的结果中输出
1
s的数量

约束条件:
1m;
char arr[3000][3000];
对于(int i=0;iarr[i][j];
}
长整数;
cin>>q;
字符查询[3000][3000];
for(long int k=0;kquery[k][l];
}

对于(long int i=0;i好的,我认为这里有些事情很复杂。 查询的大小为10^6,您将数组声明为查询[3000][3000]。 现在,我认为您不需要存储这些查询。
cin>>q;
while(q--)
{
    cin>>a>>i>>j;
    /*Your code here*/
}
问题说明查询的形式为:AIJ 因此,例如,如果要对前2个字符串执行操作0,则查询将为: 0 1 2 但是您正在存储索引0中的二进制数!
因此,您的代码将对第二个和第三个查询执行操作。因此,您需要做的是从i和j的值中减去1。

您在堆栈上分配的两个
char[3000][3000]
,就是崩溃的原因

由于
n
没有上限约束,因此最好尝试在堆上分配它,并在异常失败时捕获异常。这可以通过使用
std::vector
来实现

替换:

int n,m;
cin >> n >> m;
char arr[3000][3000];
比如说:

#include <vector>

size_t n, m;
std::vector<std::vector<char>> arr;

while(std::cin >> n >> m) {
    try {
        arr.resize(n, std::vector<char>(m));
        break; // success, break out of the while-loop
    } catch(const std::exception& ex) {
        // exception caught, most probably a bad_alloc
        std::cerr << ex.what() << " ... try again\n";
    }
}
#包括
尺寸n,m;
std::载体arr;
而(标准::cin>>n>>m){
试一试{
arr.resize(n,std::vector(m));
break;//成功,打破while循环
}捕获(const std::exception&ex){
//捕获异常,很可能是错误的分配

std::cerr局部变量(包括数组)由编译器放置在堆栈上。堆栈是一个有限的资源,在Linux上是8MB。现在想想数组
arr
…它需要多少空间?同时
arr
query
需要多少空间?是时候了解了。以及。在线评委/竞赛网站对beginne来说真的不好还有,标准:,和。在处理查询之前,您不需要存储所有查询。一次一个。使用向量向量作为输入。(或者使用静态数组,如果您绝对必须使用数组。)此外,
'0'
既可移植又可理解;
48
不是。
#include <vector>

size_t n, m;
std::vector<std::vector<char>> arr;

while(std::cin >> n >> m) {
    try {
        arr.resize(n, std::vector<char>(m));
        break; // success, break out of the while-loop
    } catch(const std::exception& ex) {
        // exception caught, most probably a bad_alloc
        std::cerr << ex.what() << " ... try again\n";
    }
}