函数指针数组与数组分配

来源:互联网 发布:dw淘宝代码使用教程 编辑:程序博客网 时间:2024/06/18 07:34

用malloc这类函数时一定要检查返回值,否则可能会导致程序非正常终止:

float *vector = malloc(20 *sizeof(float));

if (vector == NULL) {

    //malloc分配内存失败

}else{

    //to do

}

后续malloc中为了简单起见,malloc分配都表示成功


typedef int(*FptrOperation)(int,int);

typedef int (*Operation) (int,int);

Operation operations[2] = {NULL};

//int (*Operation[2]) = {NULL}; 所有元素初始化为NULL


int add(int a,int b)

{

    return a+b;

}


int subtract(int a,int b)

{

    return a-b;

}


int fptrFunc(FptrOperation ptr,int a,int b)

{

   return  ptr(a,b);

    

}



//初始化

void initializeOperationsArray()

{

    operations['+']=add;

    operations['-']=sub;   

}


//使用函数指针数组

int evaluateArray(char opcode,int num1,int num2)

{

    FptrOperation operation;

    operation = operations[opcode];

    return operation(num1,num2);

}


NSLog(@"%d",fptrFunc(subtract,4, -4));

initializeOperationsArray();

NSLog(@"%d",evaluateArray('+',4,10));

NSLog(@"%d",evaluateArray('-',4,10));



//realloc调整数组长度(增加)

char *getLine(void)

{

    const size_t sizeIncrement =10;

    char *buffer = malloc(sizeIncrement);

    char *currentPosition = buffer;

    size_t maximumLength = sizeIncrement;

    size_t lenght = 0;

    int character;

    

    if (currentPosition == NULL) {return NULL;}

    

    while (1) {

        character = fgetc(stdin);

        if (character == '\n') {

            break;

        }

        if (++lenght >= maximumLength) {

            char *newBuffer = realloc(buffer, maximumLength +=sizeIncrement);

            

            if (newBuffer == NULL) {

                free(buffer);

                return NULL;

            }

            currentPosition = newBuffer +(currentPosition -buffer);

            buffer = newBuffer;

        }

        *currentPosition ++ = character;

    }

    *currentPosition = '\0';

    return buffer;

}


//realloc调整数组长度(减少)

char *trim(char *phrase)

{

    char *old = phrase;

    char *new = phrase;

    

    while (*old ==' ') {//跳过开头空白符:”   helloworld"

        old ++;

    }

    

    while (*old) {

        *(new++) = *(old++);

    }

    *new = '\0';

    return (char *)realloc(phrase,strlen(new)+1);

}


//display2DArray(matrix,2);

void display2DArray(int arr[][5],int rows)

{

    for (int i =0; i <rows; i ++) {

        for (int j =0; j<5; j++) {

            printf("%d",arr[i][j]);

        }

        printf("\n");

    }

}



//display2DArrayUnknownSize(&matrix[0][0],2,5);

void display2DArrayUnknowSize(int *arr,int rows,int cols)

{

    for (int i =0; i <rows; i ++) {

        for (int j =0; j<cols; j++) {

            printf("%d",*(arr+ (i*cols)+j));

            //printf("%d",(arr+i)[j]);

        }

        printf("\n");

    }

}



//分配连续内存

void mallocContinuity(){

    int rows =2;

    int columns = 5;

    int **matrix = (int **)malloc(rows *sizeof(int*));

    matrix[0] = (int *)malloc(rows *columns *sizeof(int));

    

    for (int i =1; i <rows; i ++) {

        matrix[i] = matrix[0] +i *columns ;

    }

  //  *(matrix +(i * columns)+j)= i*j;

}


//分配不连续内存

void mallocDiscontinuity(){

    int rows =2;

    int columns = 5;

    int **matrix = (int **)malloc(rows *sizeof(int*));

  

    for (int i =1; i <rows; i ++) {

         matrix[0] = (int *)malloc(columns *sizeof(int));

    }

}


//不规则数组

int (*(arr1[]))= {

    (int[]){0,1,2},

    (int[]){3,5,6},

    (int[]){4,8,9},

 //   printf("%d",arr1[i][j]);

};


int (*(arr2[]))= {

    (int[]){0,1,2,6},

    (int[]){3,5},

    (int[]){4,8,9}

};


//int rows = 0;

//for(int i =0,i<4;i++){printf(arr2[row][i]);}


//int rows = 1;

//for(int i =0,i<2;i++){printf(arr2[row][i]);}


//int rows = 2;

//for(int i =0,i<3;i++){printf(arr2[row][i]);}





1 0
原创粉丝点击