为什么这个程序在我插入前2个输入后崩溃
why this program crash after i insert the first 2 input
我必须在函数中进行动态分配(双指针(,然后我必须在矩阵中放入一些数字,然后将其释放
当我必须在第一次动态分配后创建矩阵时,我也试图在第一个函数中写**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
数量的int
s分配内存。您需要为*r
数量的int*
s(指针而非int
s(分配内存
它需要:
*matrice=(int **) calloc (*r, sizeof(int*));
您使用C++作为语言标记,但您的代码设计为像C程序一样工作。正确使用C++并使程序更干净。
- 对容器使用
std::vector
并消除管理内存的需要 - 使用引用类型在函数之间传递参数
因此:
#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);
}
相关文章:
- C++多个输入和输出
- 为什么有时我输入一个整数,程序将第一个输入的数字打印成十进制数?
- 该程序只接受 5 个输入,而我给出 n=8
- 在 2D 矢量中获取多个输入时出现问题
- 使用多个输入向量中值的笛卡尔乘积调用 lambda
- 如何获取C++中的输入并将其"split"到列表中?换句话说,取 N 个输入并放入 N 长度的数组中
- 多个输入输入 for 循环
- Cin 需要两个输入
- 如何通过一次运行将多个输入样本馈送到C++张量流模型
- C++ 链表:它不会删除第一个输入
- 多个输入的代码失败
- 如何从用户的5个输入中找到最大值
- 为什么这个程序在我插入前2个输入后崩溃
- 计算着色器Open GL ES的多个输入
- 我正在尝试使用 c++ 编写二叉搜索树,但该程序仅接受 2 个输入并停止
- 为什么我的代码在要求打印长度和宽度的值后不接受多个输入?
- std::具有两个输入参数的矢量构造函数
- 有没有办法将两个输入图像堆叠到卤化物发生器中的单个 4 维缓冲区中?
- 使用 scanf() 具有不同数据类型的多个输入
- 如果两个输入流相等,我如何构造主()到输出是