Member 13349939 Ответов: 3

Что не так в моем коде C++, это дает мне ошибку segmetation fault (code dumped) error


я устал писать программу для динамического создания 2d-массива, но она выдает мне ошибку во время выполнения,пожалуйста, скажите мне, в чем здесь проблема
ошибка: ошибка сегментации (сброшенный код)

Что я уже пробовал:

#include<iostream>
using namespace std;
int main(){
	int a,b;
	static int**bptr;
	cout<<"Enter the number of row and collumn : ";
	cin>>a>>b;
	bptr=new int*[a];
	for(int i=0;i<a;i++){
		*(bptr+(sizeof(int*)*i))=new int[b];
		for(int j=0;j<b;j++){
			cin>>*(*(bptr+(sizeof(int*)*i))+(sizeof(int)*j));
		}
	}
}

3 Ответов

Рейтинг:
2

k5054

Проблема в том, что вы используете математику указателей, которая в данном случае не нужна.

В C / C++ при добавлении значения к указателю компилятор не добавляет целочисленное значение к базовому указателю, а вычисляет размер ссылочного элемента и добавляет его к базовому указателю.

Допустим, у нас есть это:
int a[10];
int *p = a;

Если мы напечатаем значение p (то есть ячейку памяти, на которую указывает p), мы можем получить значение типа 0x800. Тогда, если мы выведем значение (p+1), то получим не 0x801, а фактически 0x804. Компилятор делает расчет размеров элементов для вас.

Итак, если мы хотим использовать p для присвоения значений 10..19 массиву a, приведенному выше, мы можем написать

for(int i = 0; i < 10; ++i)
    p[i] = i + 10;


Рейтинг:
1

CPallini

Ваш код неправильно использует арифметику указателей (см., например 6.8 арифметика указателей и индексация массивов | Learn C++[^]).

Попробуй

#include<iostream>
using namespace std;
int main()
{
  int rows, cols;
  int * * bptr;
  cout<<"Enter the number of rows : ";
  cin >> rows;
  cout<<"Enter the number of cols : ";
  cin >> cols;

  bptr = new int *  [rows];

  for (int r = 0; r < rows; ++r)
  {
    bptr[r] = new int[cols];

    for (int c = 0; c < cols; c++)
    {
      cout << "please enter the value at " << r << ", " << c << endl;
      cin >> bptr[r][c];
    }
  }

  for (int r = 0; r < rows; ++r)
  {
    for (int c = 0; c < cols; ++c)
      cout << bptr[r][c] << "\t";
    cout << endl;
  }

  for (int r = 0; r < rows; ++r)
    delete [] bptr[r];

  delete [] bptr;

}


Рейтинг:
0

Richard MacCutchan

Почему вы написали такие сложные заявления? Они обязательно вызовут проблемы. Просто попробуйте что-нибудь вроде:

for(int i=0;i<a;i++)
    {
    bptr[i] = new int[b];
    for(int j=0;j<b;j++)
            {
        cin>> bptr[i][j];
    }
}