将2D数组传递给具有指针的函数 注释

问题描述

任何人都可以解释print()函数有什么问题吗?

printf(“ Control”)无效,输出为分段错误11

struct HomeView: View {
    var body: some View {
        NavigationView {
            Text("Hello,World!")
                .navigationTitle("Hello,World!")
                .toolbar {
                    ToolbarItem(placement: .bottomBar) {
                        HStack {
                            Spacer()
                            Button(action: { print("pressed") }) {
                                Image(systemName: "plus.circle.fill")
                                    .imageScale(.large)
                                    .font(.title)
                            }
                        }
                    }
                }
        }
    }
}

第一步:用值填充地址

import unittest
import pandas as pd
from unittest.mock import patch
from pandas.util.testing import assert_frame_equal

with patch('pandas.datetime.utcNow',return_value="2020-08-16 20:36:06.578174"):
              actual = my_function()
              expected = pd.DataFrame(data=[[1,"2020-08-16 20:36:06.578174"]],columns=['value','utc_timestamp'])
              assert_frame_equal(actual,expected)

直到这里一切都还不错。 我遇到了细分错误:在下面的代码和“控件”行之后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,n);

解决方法

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

之所以会这样,是因为您的imatrix函数没有返回它创建的矩阵,并且matrix中的main没有任何值。

实际上,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 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("\n\n");
    }

    /* 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,"%s\n","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));
    

    在C中,对返回值malloc的显式转换最多是毫无意义的,因为malloc返回一个void*并且C乐于自动将void*转换为任何类型的指针。使用目标(sizeof(*lvalue)指向的对象的类型而不是插入特定的类型,可以防止在将来的编辑中该类型会更改,并且您忘记了在所有对malloc。 (例如,考虑如果您决定将matrix做成long long而不是int的矩阵,会发生什么。)