c-分割故障增加数组大小并尝试达到


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
void print(int **array,int row,int col){
    int i,j;
    for(i=0;i<row;++i){
        for(j=0;j<col;++j){
            printf("%d ",array[i][j]);
        }
        printf("n");
    }
}
int **take(int *row,int *col){
    int i; int **array;
    printf("Enter the row number for array n");
    scanf("%d",row);
    printf("Enter the column number for the array n");
    scanf("%d",col);
    array=(int**)malloc(sizeof(int*)*(*row));
    for(i=0;i<(*row);++i){
        array[i]=(int*)malloc(sizeof(int)*(*col));
    }
    return array;
}
void assign(int **array,int row,int col){
    int i,j;
    srand(time(NULL));
    for(i=0;i<row;++i){
        for(j=0;j<col;++j){
            array[i][j]=rand()%50;
        }
    }
}
int **increase(int **array,int *row,int *col){
int **temp;int trow=*row;int tcol=*col;
    temp=take(row,col);  
    memcpy(temp,array,sizeof(int)*trow*tcol);
    free(array);
    return temp;
}

int main(){
    int **array=NULL; int row,col;
    array=take(&row,&col); 
    assign(array,row,col);
    print(array,row,col);
    array=increase(array,&row,&col);
    array[2][0] = 1;
    free(array);
    return 0;
}

首先制作2乘3矩阵并打印它,然后将其增加3乘4,然后尝试到达数组[2] [0],我正在进行分段故障问题是什么。我检查了很多次,但我找不到任何东西

memcpy(temp,array,sizeof(int)*trow*tcol);是错误的。
array不是连续的int
array如下所示。

[int*][int*][int*]...
 |   |
 |   +-→[int][int][int]...
 |
 +-→[int][int][int]...

这样修复

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
void print(int **array, int row, int col){
    int i, j;
    for(i = 0; i < row; ++i){
        for(j = 0; j < col; ++j){
            printf("%2d ", array[i][j]);
        }
        printf("n");
    }
}
int **take(int *row,int *col){
    int **array, i;
    printf("Enter the row number for array n");
    scanf("%d", row);
    printf("Enter the column number for the array n");
    scanf("%d", col);
    array = malloc(sizeof(int*) * (*row));
    for(i = 0; i < (*row); ++i){
        array[i] = calloc(*col, sizeof(int));
    }
    return array;
}
void assign(int **array,int row,int col){
    int i,j;
    srand(time(NULL));
    for(i=0;i<row;++i){
        for(j=0;j<col;++j){
            array[i][j]=rand()%50;
        }
    }
}
int **increase(int **array, int *row, int *col){
    int **temp, trow = *row, tcol = *col;
    temp=take(row, col);
    if(*row < trow || *col < tcol){
        printf("Was decreased.n");
        for(int i = 0; i < *row; ++i)
            free(temp[i]);
        free(temp);
        *row = trow; *col = tcol;
        return array;//not change
    }
    for(int i = 0; i < trow; ++i){
        memcpy(temp[i], array[i], sizeof(int) * tcol);
        free(array[i]);
    }
    free(array);
    return temp;
}
int main(void){
    int **array = NULL;
    int row, col;
    array=take(&row, &col); 
    assign(array, row, col);
    print(array, row, col);
    array = increase(array, &row, &col);
    //test: 2, 3 --> 3, 4
    array[2][0] = 1;
    print(array, row, col);
    for(int i = 0; i < row; ++i)
        free(array[i]);
    free(array);
    return 0;
}

您的二维矩阵由指向一个维度int数组的指针表示。

阵列不是连续的二维数组。使用memcpy将旧数组复制到新数组中,在功能增加中将不起作用。

您必须迭代每个指针,然后通过指向指向的数组。基本上使用两个嵌套环,就像打印阵列时一样。


在函数增加中,代码不能免费阵列指向指向:

free(array);

只有指针的阵列也被释放,当它也应释放指针数组的每个元素时。如果您查看阵列的分配方式很明显:

array=(int**)malloc(sizeof(int*)*(*row));
for(i=0;i<(*row);++i){
    array[i]=(int*)malloc(sizeof(int)*(*col));
}

而不是memcpyrealloc可用于增加array的大小。检查Realloc和Malloc的返回,因为它们可能会失败。
还应检查SCANF的返回,因为它也可能失败。
这不是SCANF,而是使用fgets进行输入,并在get_int_range函数中使用strtol的输入解析。
使用REALLOC允许组合takeincrease功能。由于take功能现在对旧尺寸有了了解,因此也可以包括assign功能的操作。
takeaway处理释放分配的内存。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <errno.h>
#include <limits.h>
//inputs
// char *line : pointer to text to be parsed
// char **next : pointer to pointer to allow modification of caller's pointer
// char *delim : pointer to characters to be considered terminators
// int *value : pointer to int to allow modification of caller's int
// int min : minimum value of range
// int max : maximum value of range
// returns : 0 failure or 1 success
int get_int_range ( char *line, char **next, char *delim, int *value, int min, int max)
{
    long int input = 0;
    char *end = NULL;//will point to end of parsed value
    if ( line == NULL) {
        return 0;
    }
    errno = 0;
    input = strtol ( line, &end, 10);//get the integer from the line. end will point to the end of the parsed value
    if ( ( errno == ERANGE && ( input == LONG_MAX || input == LONG_MIN))
    || ( errno != 0 && input == 0)){// parsing error from strtol
        perror ( "input");
        return 0;
    }
    if ( end == line) {// nothing was parsed. no digits
        line[strcspn ( line, "n")] = '';//remove newline
        printf ( "input [%s] MUST be a numbern", line);
        return 0;// return failure
    }
    // *end is the character that end points to
    if ( *end != '' && !( delim && strchr ( delim, *end))) {// is *end '' or is *end in the set of term characters
        line[strcspn ( line, "n")] = '';//remove newline
        printf ( "problem with input: [%s] n", line);
        return 0;
    }
    if ( input < min || input > max) {// parsed value is outside of range
        printf ( "input out of range %d to %dn", min, max);
        return 0;
    }
    if ( next != NULL) {// if next is NULL, caller did not want pointer to end of parsed value
        *next = end;// *next allows modification to caller's pointer
    }
    if ( value == NULL) {
        return 0;
    }
    *value = input;// *value allows modification to callers int
    return 1;// success
}
void print(int **array,int row,int col){
    int i,j;
    for(i=0;i<row;++i){
        for(j=0;j<col;++j){
            printf("%d ",array[i][j]);
        }
        printf("n");
    }
}
int **take(int **array, int *row, int *col){
    char line[256] = "";
    int i;
    int each = 0;
    int newrow = 0;
    int newcol = 0;
    int valid = 0;
    int **temp = 0;
    int *temprow = 0;
    do {
        printf("Enter the row number for array n");
        fgets ( line, sizeof ( line), stdin);//read a line
        valid = get_int_range ( line, NULL, "n", &newrow, (*row) + 1, INT_MAX);// call to parse a value
    } while ( !valid);
    do {
        printf("Enter the column number for the array n");
        fgets ( line, sizeof ( line), stdin);//read a line
        valid = get_int_range ( line, NULL, "n", &newcol, (*col) + 1, INT_MAX);// call to parse a value
    } while ( !valid);
    if ( ( temp = realloc ( array, sizeof( int*) * ( newrow))) == NULL) {
        fprintf ( stderr, "problem reallocatingn");
        return array;
    }
    array = temp;
    for(i=0;i<(*row);++i){//realloc existing rows 
        if ( ( temprow = realloc ( array[i], sizeof ( int) * ( newcol))) == NULL) {
            fprintf ( stderr, "problem reallocating row n");
            return array;
        }
        array[i] = temprow;
        for ( each = *col; each < newcol; each++) {
            array[i][each] = rand ( ) % 50;
        }
    }
    for(i=(*row);i<newrow;++i){// malloc new rows
        if ( ( array[i] = malloc ( sizeof ( int) * ( newcol))) == NULL) {
            fprintf ( stderr, "problem allocating row n");
            return array;
        }
        for ( each = 0; each < newcol; each++) {
            array[i][each] = rand ( ) % 50;
        }
    }
    *row = newrow;
    *col = newcol;
    return array;
}
int **takeaway ( int **array, int *row, int *col) {//free allocated memory
    *col = 0;
    while ( *row){
        *row -= 1;
        free ( array[*row]);
    }
    free ( array);
    return NULL;
}
int main(){
    int **array=NULL;//so realloc will work on the first call
    int row = 0;
    int col = 0;
    srand(time(NULL));//call srand once early in the program
    array=take(array,&row,&col);
    print(array,row,col);
    array=take(array,&row,&col);
    array[2][0] = 1;
    print(array,row,col);
    array = takeaway ( array, &row, &col);
    return 0;
}

相关内容

  • 没有找到相关文章