为什么这个程序在我插入前2个输入后崩溃

why this program crash after i insert the first 2 input

本文关键字:2个 输入 崩溃 插入 程序 为什么      更新时间:2023-10-16

我必须在函数中进行动态分配(双指针(,然后我必须在矩阵中放入一些数字,然后将其释放

当我必须在第一次动态分配后创建矩阵时,我也试图在第一个函数中写**matrixe而不是*(matrixe[i](,但这总是错误的,在这种情况下,程序在我插入矩阵的第一行后退出

#include <iostream>
#include <stdlib.h>
using namespace std;
void allocaMatrice(int *** matrice,int * r,int * c);
void leggiMatrice(int ** matrice,int r,int c);
void scriviMatrice(int ** matrice,int r,int c);
void deallocaMatrice(int ** matrice,int r);
int main (){
int **matrice;
int r, c;
allocaMatrice(&matrice,&r,&c);
leggiMatrice(matrice,r,c);
scriviMatrice(matrice,r,c);
deallocaMatrice(matrice,r);
cin.get();
return 0;
}
void allocaMatrice(int *** matrice,int * r,int * c){
cout<<"Dimmi il numero di righe della matrice"<<endl;
cin>>*r;
while(cin.get()!='n');
cout<<"Dimmi il numero di colonne della matrice"<<endl;
cin>>*c;
while(cin.get()!='n');
*matrice=(int **) calloc (*r,sizeof(int));
for(int i=0;i<*c;i++){
*matrice[i]=(int *) malloc ((*c)*sizeof(int));
}   
}
void leggiMatrice(int ** matrice,int r,int c){
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
cout<<"Dimmi l'elemeno alla riga e colonna corrente"<<endl;
cin>>matrice[i][j];
while(cin.get()!='n');
}
}
}
void scriviMatrice(int ** matrice,int r,int c){
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
cout<<matrice[i][j]<<"t";
}
cout<<endl;;
}
}
void deallocaMatrice(int ** matrice,int r){
int i;
for(i=0;i<r;i++){
free((*matrice)+1);
}
free(matrice);
}

调试错误为"程序接收信号SIGSEGV,分段故障">

*matrice=(int **) calloc (*r,sizeof(int));

是不对的。它为*r数量的ints分配内存。您需要为*r数量的int*s(指针而非ints(分配内存

它需要:

*matrice=(int **) calloc (*r, sizeof(int*));

您使用C++作为语言标记,但您的代码设计为像C程序一样工作。正确使用C++并使程序更干净。

  1. 对容器使用std::vector并消除管理内存的需要
  2. 使用引用类型在函数之间传递参数

因此:

#include <iostream>
#include <vector>
template<typename T>
using VecVec = std::vector<std::vector<T>>;
using IntVecVec = VecVec<int>;
void allocaMatrice(IntVecVec& matrice);
void leggiMatrice(IntVecVec& matrice);
void scriviMatrice(IntVecVec const& matrice);
// Not necessary.
// void deallocaMatrice(int ** matrice,int r);
int main() {
IntVecVec matrice;
allocaMatrice(matrice);
leggiMatrice(matrice);
scriviMatrice(matrice);
std::cin.get();
}
void allocaMatrice(IntVecVec& matrice) {
int righe, colonne;
std::cout << "Dimmi il numero di righe della matricen";
std::cin >> righe;
//while (cin.get() != 'n');???
std::cout << "Dimmi il numero di colonne della matricen";
std::cin >> colonne;
//while (cin.get() != 'n');??
matrice.resize(righe, std::vector<int>(colonne, 0));
}
void leggiMatrice(IntVecVec& matrice) {
for (auto& riga : matrice) {
for (auto& elemeno : riga) {
std::cout << "Dimmi l'elemeno alla riga e colonna correnten";
std::cin >> elemeno;
//while(cin.get()!='n'); // what does this add?
}
}
}
void scriviMatrice(IntVecVec const& matrice) {
for (auto const& riga : matrice) {
for (auto const& elemeno : riga) {
std::cout << elemeno << 't';
}
std::cout << 'n';
}
}

我将在前面的答案中添加C++中的一个重要概念:类。您使用C++进行面向对象编程。否则你还不如用C.

看看你能不能跟上。

#include <iostream>
#include <vector>
template<typename T>
class Matrice {
private:
std::vector<std::vector<T>> matrice;
public:
void alloca();
void leggi();
void scrivi() const;
};
int main() {
Matrice<int> matrice;
matrice.alloca();
matrice.leggi();
matrice.scrivi();
std::cin.get();
}
template<typename T>
T Read() {
T output;
std::cin >> output;
return output;
}
template<typename T>
void Matrice<T>::alloca() {
std::cout << "Dimmi il numero di righe della matricen";
auto righe = Read<int>();
std::cout << "Dimmi il numero di colonne della matricen";
auto colonne = Read<int>();
matrice.resize(righe, std::vector<T>(colonne, 0));
}
template<typename T>
void Matrice<T>::leggi() {
for (auto& riga : matrice) {
for (auto& elemeno : riga) {
std::cout << "Dimmi l'elemeno alla riga e colonna correnten";
std::cin >> elemeno;
}
}
}
template<typename T>
void Matrice<T>::scrivi() const {
for (auto const& riga : matrice) {
for (auto const& elemeno : riga) {
std::cout << elemeno << 't';
}
std::cout << 'n';
}
}

我想我找到了解决方案:在第一次动态分配之后的函数allocaMatrice中(*matrice=(int**(calloc(*r,sizeof(int((;(我在第二次动态分配中犯了一个错误,而不是:

for(int i=0;i<*c;i++){
*matrice[i]=(int *) malloc ((*c)*sizeof(int));
}

我应该写这个:

for(int i=0;i<*c;i++){
(*matrice)[i]=(int *) malloc ((*c)*sizeof(int));
}   

所以最后的节目是这样的:#包括#包括

using namespace std;
void allocaMatrice(int *** matrice,int  &r,int &c);
void leggiMatrice(int ** matrice,int r,int c);
void scriviMatrice(int ** matrice,int r,int c);
void deallocaMatrice(int ** matrice,int r);
int main (){
int **matrice;
int r, c;
allocaMatrice(&matrice,r,c);
leggiMatrice(matrice,r,c);
scriviMatrice(matrice,r,c);
deallocaMatrice(matrice,r);
cin.get();
return 0;
}
void allocaMatrice(int *** matrice,int  &r,int &c){
int i;
cout<<"Dimmi il numero di righe della matrice"<<endl;
cin>>r;
while(cin.get()!='n');
cout<<"Dimmi il numero di colonne della matrice"<<endl;
cin>>c;
while(cin.get()!='n');
*matrice=(int **) calloc (r, sizeof(int*));
cout<<"c";
for(i=0;i<c;i++){
(*matrice)[i]=(int *) calloc (c,sizeof(int));
}    
}
void leggiMatrice(int ** matrice,int r,int c){
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
cout<<"Dimmi l'elemeno alla riga "<<i+1<<" e alla colonna     "<<j+1<<endl;
cin>>matrice[i][j];
while(cin.get()!='n');
}
}
}
void scriviMatrice(int ** matrice,int r,int c){
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
cout<<matrice[i][j]<<"t";
}  
cout<<endl;;
}
}
void deallocaMatrice(int ** matrice,int r){
int i;
for(i=0;i<r;i++){
free((*matrice)+1);
}
free(matrice);
}