编译时我没有遇到任何错误。当我运行它时程序崩溃了。我试图直接从generate函数打印矩阵,它打印第一行和第二行。
这是我的代码
void generate(int **a)//*Function to generate a matrix a[i][j]=i+j*
{
int i,j;
for(i=0;i<5;i++){
for(j=0;j<4;j++){
a[i][j]=i+j;
}
}
}
void print(int **a)//*print the resulting matrix from generate function*
{
int i,j;
for(i=0;i<5;i++){
for(j=0;j<4;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
}
int main()
{
int *a=(int*)malloc(5*4*sizeof(int));//*allocating memory for a matrix of 4 lines and 5 columns.*
generate(&a);
print(&a);
}
答案 0 :(得分:1)
1)您正在分配单维记忆。
a[i][j]=i+j; //is not valid.
以下是修改后的代码
#include <stdio.h>
#include <stdlib.h>
void generate(int *a)//*Function to generate a matrix a[i][j]=i+j*
{
int i,j;
for(i=0;i<5;i++){
for(j=0;j<4;j++){
*a=i+j;
a++; //increments to next memory location
}
}
}
void print(int *a)//*print the resulting matrix from generate function*
{
int i,j;
for(i=0;i<5;i++){
for(j=0;j<4;j++){
printf("%d ",*(a++)); //notice another way of accessing
}
printf("\n");
}
}
int main()
{
int *a=(int*)malloc(5*4*sizeof(int));//*allocating memory for a matrix of 4 lines and 5 columns.*
generate(a);
print(a); //passing the pointer
free(a); //Always always practice to free the allocated memory, don't ever do this mistake again
return 0;
}
答案 1 :(得分:0)
两件事:
首先,a[i][j]
表示指向指向int的指针的指针,而不是指向int数组的指针。
其次,当您只是将指针传递给某些数据结构时,例如一个4x5的整数数组,则编译器无法导出此数据结构的布局。即像i
这样的语句要求编译器“知道”每行j
由4列a + (4*i) + j
组成,这样它就可以计算应该存储值的“位置” ,即4
。编译器根本不知道每行的列数,即void generate(int *a)//*Function to generate a matrix a[i][j]=i+j*
{
int i,j;
for(i=0;i<5;i++){
for(j=0;j<4;j++){
*(a+(i*4+j)) = i+j;
}
}
}
void print(int *a)//*print the resulting matrix from generate function*
{
int i,j;
for(i=0;i<5;i++){
for(j=0;j<4;j++){
printf("%d ", *(a+(i*4+j)));
}
printf("\n");
}
}
int main()
{
int *a=(int*)malloc(5*4*sizeof(int));//*allocating memory for a matrix of 4 lines and 5 columns.*
generate(a);
print(a);
}
。
要在保持数组大小至少可能变化的同时克服这一点(注意“4”和“5”仍然在函数中进行硬编码),您可以执行以下操作:
$thankYouMessage