c++ - 为什么这个程序在我插入前 2 个输入后崩溃
问题描述
我必须在函数中进行动态分配(双指针),然后我必须在矩阵中放入一些数字,然后释放它
当我必须在第一次动态分配之后创建矩阵时,我也尝试在第一个函数中编写 **matrice 而不是 *(matrice[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));
是不正确的。它为s的*r
数量分配内存。int
您需要为 s 的*r
数量分配内存int*
(指针不是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 matrice\n";
std::cin >> righe;
//while (cin.get() != '\n');???
std::cout << "Dimmi il numero di colonne della matrice\n";
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 corrente\n";
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';
}
}
推荐阅读
- networkx - 使用networkx图算法而不构建图
- html - 如何定位html页面上的非活动元素?
- python - 将数据集的维度从 (32,32,3,10000) 更改为 (10000,32,32,3) 以训练 CNN
- c - 警告:函数'strcpy'的隐式声明[-Wimplicit-function-declaration]程序工作,但我如何修复编译器错误
- javascript - 未捕获的类型错误:无法读取 null 的属性“addEventListener”。var 1 打印 null
- r - 如何选择系数在 R 的虚拟变量中具有 50% 真和 50% 假?
- ios - 表视图底部约束不会动画/更改
- node.js - 如何将 FCM 消息连接到与 mongoDB 连接的服务器 node.js?
- functional-programming - 控制函数中的副作用
- c# - IClaimsTransformation 未触发