c-将2d数组传递给带有指针的函数



有人能解释print((函数的错误吗?

printf("Control"(从不工作,输出为分段故障-11

int main(int argc, char **argv){
int m=5,n=4;    // matrix[5][4]
int a=50,b=20;  // range: 20-50
int **matrix;
imatrix(matrix,m,n,a,b);
print(matrix,m,n);

第一步:用值填充地址

void imatrix(int **matrix,int m,int n,int max, int min){
srand(time(NULL));
int i=0,j=0;

matrix = (int **)malloc( m * sizeof(int*) );
if( matrix == NULL ){
printf( "memory req.!" );
}


for( i = 0; i < m; i++ ) {
matrix[i] = (int *)malloc( n * sizeof(int) );
if( matrix[i] == NULL ){
printf( "memory req.!" );
}
}


for(i=0;i<m;i++){
for(j=0;j<n;j++){
matrix[i][j]=(rand()%(max-min))+min;
printf("%2d ",matrix[i][j]);
}
printf("nn");
}
}

到这里为止一切都还好。我得到了分段错误:11后面的代码和行的";控制";从不工作

void print(int **matrix, int m, int n){
int i,j;
for(i=0; i < m; i++){
for(j=0; j < n; j++){
printf("%d",*(*(matrix + i) + j));
}
printf("n");
}
printf("control");
}

分段错误的不是printf("control")(尽管你最好不要使用printf:考虑将其更改为puts("control"),它也会输出换行符。(这是之前打印矩阵的尝试,它正在取消对未初始化值的引用。

发生这种情况是因为imatrix函数不返回它创建的矩阵,并且main中的matrix没有给定任何值。

事实上,imatrix不返回任何内容,因为它被定义为返回void。它采用了一个matrix参数,我想它应该是一个输出参数,但是:

  • 该参数的输出参数类型错误(输出参数需要是指向要返回的对象的指针;(

  • 它从不试图使用指向要返回的对象的指针来返回对象。

为了满足这些要求,您需要原型

void imatrix(int*** matrix, int m, int n, int max, int min);

您必须为每次使用matrix添加一个额外的间接级别[注1]:

*matrix = malloc(m * sizeof(**matrix));
if (*matrix == NULL) {
printf( "memory req.!" );
/* NOTE: You shouldn't attempt to continue after the malloc fails.
* Return immediately and let the caller deal with the malloc failure.
*/
}
for( i = 0; i < m; i++ ) {
(*matrix)[i] = malloc( n * sizeof(*(*matrix)[i])) );
if( (*matrix)[i] == NULL ){
// etc.

我认为我们可以同意,这是一个重大的PITA,除非必要,否则不值得麻烦。

就我个人而言,我发现除非绝对必要,否则根本不使用输出参数不那么令人困惑。在这种情况下,根本没有必要,因为您只需返回指针来分配内存:

/* CHANGE: Prototype */
int** imatrix(int m, int n, int max, int min){
srand(time(NULL)); /* TODO: This initialisation should really be done in main */
int i=0, j=0;

/* CHANGE: matrix is a local variable */
int** matrix = malloc( m * sizeof(*matrix) );
/* CHANGE: Immediate return on malloc failure */
if( matrix == NULL ) {
return matrix;
}

for( i = 0; i < m; i++ ) {
matrix[i] = malloc( n * sizeof(*matrix[i]) );
if( matrix[i] == NULL ){
printf( "memory req.!" );
}
}


for(i=0;i<m;i++){
for(j=0;j<n;j++){
matrix[i][j]=(rand()%(max-min))+min;
printf("%2d ",matrix[i][j]);
}
printf("nn");
}
/* CHANGE: matrix is returned */
return matrix;
}

这有一个稍微不同的使用模式:

int main(int argc, char **argv){
int m=5, n=4;    // matrix[5][4]
int a=50, b=20;  // range: 20-50
/* CHANGE: imatrix returns the new matrix */
int **matrix = imatrix(m, n, a, b);
/* CHANGE: check for failure */
if (matrix == NULL) {
fprintf(stderr, "%sn", "imatrix failed to allocate memory.");
exit(1);
}
print(matrix, m, n);
/* TODO: Free the storage allocated for matrix */
}

注释

  1. 在整个代码中,我将malloc的用法从:

    lvalue = (RedundantCast*)malloc(count * sizeof(FixedType));
    

    习惯用法C:

    lvalue = malloc(count * sizeof(*lvalue));
    

    malloc的返回值的显式强制转换在C中充其量是没有意义的,因为malloc返回void*,而C很乐意将void*自动转换为任何类型的指针。使用目标指向的对象的类型(sizeof(*lvalue)(,而不是插入特定的类型,可以防止该类型在将来的编辑中发生更改,并且在对malloc的所有调用中都忘记了进行更改。(例如,考虑一下如果您决定将matrix设为long long的矩阵而不是int,会发生什么。(

相关内容

  • 没有找到相关文章

最新更新