gpt4 book ai didi

C++ 二维数组分配内存以避免段错误

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:31 24 4
gpt4 key购买 nike

我通常使用其他语言(R、Python 和 Java)编写代码,但最近开始使用 C++。我一直在解决 hackerrank.com 上的问题,特别是我遇到了这个问题: https://www.hackerrank.com/challenges/variable-sized-arrays

在这个问题之前,我从未遇到过Segmentation Fault 错误。我修改了代码,发现错误仅在我尝试从 arr 变量打印时发生。

我想知道是否有人可以帮我解决这个问题,也许可以提供关于确切错误的详细解释?

代码如下,但问题可能出在 int arr[100000][100000] = {-1};printf("%d\n", arr [iHat][jHat]); 因为我可以 printf iHatjHat 本身,但我无法使用它们访问 arr 数组中的整数。

#include <iostream>

using namespace std;
int main(){

int n, q;

/*
*scan in:
*n array entries
*q quaries
*/

int arr[100000][100000] = {-1}; //initialize an array, larger than 10^5

scanf("%d %d\n", &n, &q); //n is size of array, q is # of quaries

for (int i = 0; i < n; ++i){ //loop through lines of input to populate array
int c, y = 0; //initialize to zero at the start of each line
while((c = getchar()) != '\n'){ //readline
if(c != ' '){ //pass spaces
arr[i][y] = c; //place integer into array
++y;
}
}
}

for (int i = 0; i < q; ++i){
int iHat, jHat = 0;
scanf("%d %d\n", &iHat, &jHat); //scan for coordinates
printf("%d\n", arr[iHat][jHat]); //Segmentation fault occurs here, why?
}
return 0;
}

更新

这个问题的重点是内存管理,尤其是指针的使用。一个有效的解决方案,不会导致段错误,如下所示:

#include <iostream>

using namespace std;
int main(){
int n, q;
/*
*scan in:
*n array entries
*q quaries
* format: %d %d
*/

scanf("%d %d\n", &n, &q);//n is size of array of arrays, q is # of quaries

int **arr = new int *[n]; //int** arr is a pointer of pointers of size n

for (int i = 0; i < n; ++i){//loop through lines of input to populate array
int k; //Always initialize variables in the narrowest scope possible!
scanf("%d", &k);//grab k, the number of ints in the line
arr[i] = new int[k];//create a 2nd dimension at entry i of size k
for (int j = 0; j < k; ++j){
scanf("%d", &arr[i][j]);//populate array
}
}

for (int i = 0; i < q; ++i){
int iHat, jHat = 0;
scanf("%d %d\n", &iHat, &jHat); //scan for query coordinates
printf("%d\n", arr[iHat][jHat]); //print results of query
}

return 0;
}

最佳答案

C++ 让您可以控制要分配内存的位置。在您的情况下,您发现您在堆栈上分配了一个超出堆栈大小的数组数组。在某些时候,您访问了位于堆栈边界和程序之外的这些元素之一,这会导致称为段错误的访问冲突。

由于您提到自己是 C++ 的新手,因此了解这 3 个内存区域以及您将如何在您的案例中使用每个区域会有所帮助:

堆栈内存 - 临时变量自动使用的空间,无需明确请求。如果超出堆栈大小,您将看到未定义的行为。

int main() {
int arr[100000][100000];
}

堆内存 - 每当使用运算符“new”明确请求时,用于动态分配空间的空间。如果请求的内存大小超过可用大小,将抛出“std::bad_alloc”异常。

 int main() {

int **arr = new int *[100000];

for (std::size_t i = 0; i < 100000; ++i) {
arr[i] = new int[100000];
}
}

静态内存 - 在主要运行之前为静态对象分配的空间。如果数组维度太大,您将收到编译器错误。

  int arr[100000][100000];

int main() {
...
}

关于C++ 二维数组分配内存以避免段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41230301/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com