#24507: RE (SIGSEGV) 記憶體區段錯誤! Segmentation fault (core dumped)


aetejay@gmail.com (Think Think)

學校 : 不指定學校
編號 : 105293
來源 : [49.216.93.134]
最後登入時間 :
2023-03-20 21:07:14
a528. 大數排序 | From: [101.10.55.12] | 發表日期 : 2021-02-27 21:16

如題 小弟我在自己的編譯器試過完全沒問題

但丟上來卻一直顯示記憶體區段錯誤

不知道是哪裡發生了問題

以下程式碼

#include <stdio.h>

#include <stdlib.h>

#define MAX 10100

 

void swap(int *,int);

int  arrayLength (char *);

void sort (char *, int);

 

int main(){

    int num;

    while (scanf("%d",&num) != EOF){

        int i=0,j=0;

        char *bigNum;

        bigNum = (char*)calloc(num * MAX, sizeof(char));    //配置大數字串陣列

        if( bigNum == NULL ) {

            fprintf(stderr, "Error: unable to allocate required memory\n");

            return 1;

        }

        //fflush(stdin);

        getchar();

        while (1){

            scanf("%c", bigNum + i * MAX + j);

            if (*(bigNum + i * MAX + j) == '\n' && i == num - 1){

                break;

            }

            else if (*(bigNum + i * MAX + j) == '\n'){

                i += 1;

                j = 0;

            }

            else {

                j += 1;

            }

        }

        sort(bigNum, num);

//        for (int k=0;k<num;k++){

//            for (int l=0;l<MAX;l++){

//                printf("%c",*(bigNum+k*MAX+l));

//            }

//        }

        free (bigNum);

    }

}

 

void swap(int *array,int n){

    int t = array[n];

    array[n] = array[n-1];

    array[n-1] = t;

}

 

int arrayLength (char *array){

    int length = 0;

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

        if (*(array + i) != 0){

            length++;

        }

        else {

            break;

        }

    }

    return length;

}

 

void sort (char *numStr, int num){

    int *sorted, i=1;

    sorted = (int*)calloc(num, sizeof(char));

    for (int x=0; x<num; x++){

        sorted[x] = x;

    }

    while (i < num) {

        int j = 0;

        if (*(numStr + i * MAX + j) == '-'){    //負數比較

            //printf("- i=%d\n",i);

            int k = i;

            while (k > 0){

                if (arrayLength(numStr + sorted[k] * MAX) > arrayLength(numStr + sorted[k-1] * MAX)){   //先比長度

                    swap (sorted,k);

                    //printf("-SWAP L k=%d\n",k);

                }

                else if (arrayLength(numStr + sorted[k] * MAX) == arrayLength(numStr + sorted[k-1] * MAX)){ //長度一樣再比數字

                    //printf("Same L\n");

                    int n = 1;

                    while (n < arrayLength(numStr + sorted[k] * MAX)) {

                        if (*(numStr + sorted[k] * MAX + n) > *(numStr + sorted[k-1] * MAX + n)){

                            swap (sorted,k);

                            //printf("-SWAP N k=%d\n",k);

                        }

                        else if (*(numStr + sorted[k] * MAX + n) < *(numStr + sorted[k-1] * MAX + n)){

                            break;

                        }

                        n++;

                    }

                }

                k--;

            }

        }

        else// 正數比較

            //printf("+ i=%d\n",i);

            int k = i;

            while (k > 0) {

                if (*(numStr + sorted[k-1] * MAX + j) == '-'){

                    break;

                }

                else {

                    if (arrayLength(numStr + sorted[k] * MAX) < arrayLength(numStr + sorted[k-1] * MAX)){   //先比長度

                        swap (sorted,k);

                        //printf("+SWAP L k=%d\n",k);

                    }

                    else if (arrayLength(numStr + sorted[k] * MAX) == arrayLength(numStr + sorted[k-1] * MAX)){ //長度一樣再比數字

                        //printf("Same L\n");

                        int n = 0;

                        while (n < arrayLength(numStr + sorted[k] * MAX)) {

                            if (*(numStr + sorted[k] * MAX + n) < *(numStr + sorted[k-1] * MAX + n)){

                                swap (sorted,k);

                                //printf("+SWAP N k=%d\n",k);

                            }

                            else if (*(numStr + sorted[k] * MAX + n) > *(numStr + sorted[k-1] * MAX + n)){

                                break;

                            }

                            n++;

                        }

                    }

                }

                k--;

            }

        }

        i++;

    }

    for (int x = 0;x < num;x++){

        for (int y = 0;y < MAX;y++){

            printf("%c",*(numStr + sorted[x] * MAX + y));

        }

    }

    free(sorted);

}

 

 
#24508: Re:RE (SIGSEGV) 記憶體區段錯誤! Segmentation fault (core dumped)


jam930725@gmail.com (浮沉沉沉沉沉沉沉沉)

學校 : 國立臺中科技大學
編號 : 124762
來源 : [123.240.115.224]
最後登入時間 :
2022-08-27 13:56:53
a528. 大數排序 | From: [45.148.11.20] | 發表日期 : 2021-02-27 22:12

如題 小弟我在自己的編譯器試過完全沒問題

但丟上來卻一直顯示記憶體區段錯誤

不知道是哪裡發生了問題

以下程式碼

#include

#include

#define MAX 10100

 

void swap(int *,int);

int  arrayLength (char *);

void sort (char *, int);

 

int main(){

    int num;

    while (scanf("%d",&num) != EOF){

        int i=0,j=0;

        char *bigNum;

        bigNum = (char*)calloc(num * MAX, sizeof(char));    //配置大數字串陣列

        if( bigNum == NULL ) {

            fprintf(stderr, "Error: unable to allocate required memory\n");

            return 1;

        }

        //fflush(stdin);

        getchar();

        while (1){

            scanf("%c", bigNum + i * MAX + j);

            if (*(bigNum + i * MAX + j) == '\n' && i == num - 1){

                break;

            }

            else if (*(bigNum + i * MAX + j) == '\n'){

                i += 1;

                j = 0;

            }

            else {

                j += 1;

            }

        }

        sort(bigNum, num);

//        for (int k=0;k<num;k++){

//            for (int l=0;l<MAX;l++){

//                printf("%c",*(bigNum+k*MAX+l));

//            }

//        }

        free (bigNum);

    }

}

 

void swap(int *array,int n){

    int t = array[n];

    array[n] = array[n-1];

    array[n-1] = t;

}

 

int arrayLength (char *array){

    int length = 0;

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

        if (*(array + i) != 0){

            length++;

        }

        else {

            break;

        }

    }

    return length;

}

 

void sort (char *numStr, int num){

    int *sorted, i=1;

    sorted = (int*)calloc(num, sizeof(char));

    for (int x=0; x<num; x++){

        sorted[x] = x;

    }

    while (i < num) {

        int j = 0;

        if (*(numStr + i * MAX + j) == '-'){    //負數比較

            //printf("- i=%d\n",i);

            int k = i;

            while (k > 0){

                if (arrayLength(numStr + sorted[k] * MAX) > arrayLength(numStr + sorted[k-1] * MAX)){   //先比長度

                    swap (sorted,k);

                    //printf("-SWAP L k=%d\n",k);

                }

                else if (arrayLength(numStr + sorted[k] * MAX) == arrayLength(numStr + sorted[k-1] * MAX)){ //長度一樣再比數字

                    //printf("Same L\n");

                    int n = 1;

                    while (n < arrayLength(numStr + sorted[k] * MAX)) {

                        if (*(numStr + sorted[k] * MAX + n) > *(numStr + sorted[k-1] * MAX + n)){

                            swap (sorted,k);

                            //printf("-SWAP N k=%d\n",k);

                        }

                        else if (*(numStr + sorted[k] * MAX + n) < *(numStr + sorted[k-1] * MAX + n)){

                            break;

                        }

                        n++;

                    }

                }

                k--;

            }

        }

        else// 正數比較

            //printf("+ i=%d\n",i);

            int k = i;

            while (k > 0) {

                if (*(numStr + sorted[k-1] * MAX + j) == '-'){

                    break;

                }

                else {

                    if (arrayLength(numStr + sorted[k] * MAX) < arrayLength(numStr + sorted[k-1] * MAX)){   //先比長度

                        swap (sorted,k);

                        //printf("+SWAP L k=%d\n",k);

                    }

                    else if (arrayLength(numStr + sorted[k] * MAX) == arrayLength(numStr + sorted[k-1] * MAX)){ //長度一樣再比數字

                        //printf("Same L\n");

                        int n = 0;

                        while (n < arrayLength(numStr + sorted[k] * MAX)) {

                            if (*(numStr + sorted[k] * MAX + n) < *(numStr + sorted[k-1] * MAX + n)){

                                swap (sorted,k);

                                //printf("+SWAP N k=%d\n",k);

                            }

                            else if (*(numStr + sorted[k] * MAX + n) > *(numStr + sorted[k-1] * MAX + n)){

                                break;

                            }

                            n++;

                        }

                    }

                }

                k--;

            }

        }

        i++;

    }

    for (int x = 0;x < num;x++){

        for (int y = 0;y < MAX;y++){

            printf("%c",*(numStr + sorted[x] * MAX + y));

        }

    }

    free(sorted);

}

 

用範例測資測試了一下,你的程式碼第一組測資可以正常運行,但在第二組測資時,似乎是底下這幾行(第19-31行)產生了記憶體區段錯誤的問題。

while (1){

    scanf("%c", bigNum + i * MAX + j);

    if (*(bigNum + i * MAX + j) == '\n' && i == num - 1){

        break;

    }

    else if (*(bigNum + i * MAX + j) == '\n'){

        i += 1;

        j = 0;

    }

    else {

        j += 1;

    }

}

至於具體的原因,有待高手解答...我的C++並不好

 

將break的條件改成以下

if ((*(bigNum + i * MAX + j) == EOF || *(bigNum + i * MAX + j) == '\n' || *(bigNum + i * MAX + j) == ' ') && i == num - 1)

    break;

可以成功AC範例測資,但送出之後會有WA line10的問題

您的答案為: 12318283718923789127389172389172837129837128937128937189237189237891273891723897 ...略
正確答案為: -22222222222222222222222222222222222222222222222222222222222222222222222222
 
#24509: Re:RE (SIGSEGV) 記憶體區段錯誤! Segmentation fault (core dumped)


aetejay@gmail.com (Think Think)

學校 : 不指定學校
編號 : 105293
來源 : [49.216.93.134]
最後登入時間 :
2023-03-20 21:07:14
a528. 大數排序 | From: [101.10.55.12] | 發表日期 : 2021-02-27 23:23

如題 小弟我在自己的編譯器試過完全沒問題

但丟上來卻一直顯示記憶體區段錯誤

不知道是哪裡發生了問題

以下程式碼

#include

#include

#define MAX 10100

 

void swap(int *,int);

int  arrayLength (char *);

void sort (char *, int);

 

int main(){

    int num;

    while (scanf("%d",&num) != EOF){

        int i=0,j=0;

        char *bigNum;

        bigNum = (char*)calloc(num * MAX, sizeof(char));    //配置大數字串陣列

        if( bigNum == NULL ) {

            fprintf(stderr, "Error: unable to allocate required memory\n");

            return 1;

        }

        //fflush(stdin);

        getchar();

        while (1){

            scanf("%c", bigNum + i * MAX + j);

            if (*(bigNum + i * MAX + j) == '\n' && i == num - 1){

                break;

            }

            else if (*(bigNum + i * MAX + j) == '\n'){

                i += 1;

                j = 0;

            }

            else {

                j += 1;

            }

        }

        sort(bigNum, num);

//        for (int k=0;k<num;k++){

//            for (int l=0;l<MAX;l++){

//                printf("%c",*(bigNum+k*MAX+l));

//            }

//        }

        free (bigNum);

    }

}

 

void swap(int *array,int n){

    int t = array[n];

    array[n] = array[n-1];

    array[n-1] = t;

}

 

int arrayLength (char *array){

    int length = 0;

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

        if (*(array + i) != 0){

            length++;

        }

        else {

            break;

        }

    }

    return length;

}

 

void sort (char *numStr, int num){

    int *sorted, i=1;

    sorted = (int*)calloc(num, sizeof(char));

    for (int x=0; x<num; x++){

        sorted[x] = x;

    }

    while (i < num) {

        int j = 0;

        if (*(numStr + i * MAX + j) == '-'){    //負數比較

            //printf("- i=%d\n",i);

            int k = i;

            while (k > 0){

                if (arrayLength(numStr + sorted[k] * MAX) > arrayLength(numStr + sorted[k-1] * MAX)){   //先比長度

                    swap (sorted,k);

                    //printf("-SWAP L k=%d\n",k);

                }

                else if (arrayLength(numStr + sorted[k] * MAX) == arrayLength(numStr + sorted[k-1] * MAX)){ //長度一樣再比數字

                    //printf("Same L\n");

                    int n = 1;

                    while (n < arrayLength(numStr + sorted[k] * MAX)) {

                        if (*(numStr + sorted[k] * MAX + n) > *(numStr + sorted[k-1] * MAX + n)){

                            swap (sorted,k);

                            //printf("-SWAP N k=%d\n",k);

                        }

                        else if (*(numStr + sorted[k] * MAX + n) < *(numStr + sorted[k-1] * MAX + n)){

                            break;

                        }

                        n++;

                    }

                }

                k--;

            }

        }

        else// 正數比較

            //printf("+ i=%d\n",i);

            int k = i;

            while (k > 0) {

                if (*(numStr + sorted[k-1] * MAX + j) == '-'){

                    break;

                }

                else {

                    if (arrayLength(numStr + sorted[k] * MAX) < arrayLength(numStr + sorted[k-1] * MAX)){   //先比長度

                        swap (sorted,k);

                        //printf("+SWAP L k=%d\n",k);

                    }

                    else if (arrayLength(numStr + sorted[k] * MAX) == arrayLength(numStr + sorted[k-1] * MAX)){ //長度一樣再比數字

                        //printf("Same L\n");

                        int n = 0;

                        while (n < arrayLength(numStr + sorted[k] * MAX)) {

                            if (*(numStr + sorted[k] * MAX + n) < *(numStr + sorted[k-1] * MAX + n)){

                                swap (sorted,k);

                                //printf("+SWAP N k=%d\n",k);

                            }

                            else if (*(numStr + sorted[k] * MAX + n) > *(numStr + sorted[k-1] * MAX + n)){

                                break;

                            }

                            n++;

                        }

                    }

                }

                k--;

            }

        }

        i++;

    }

    for (int x = 0;x < num;x++){

        for (int y = 0;y < MAX;y++){

            printf("%c",*(numStr + sorted[x] * MAX + y));

        }

    }

    free(sorted);

}

 

用範例測資測試了一下,你的程式碼第一組測資可以正常運行,但在第二組測資時,似乎是底下這幾行(第19-31行)產生了記憶體區段錯誤的問題。

while (1){

    scanf("%c", bigNum + i * MAX + j);

    if (*(bigNum + i * MAX + j) == '\n' && i == num - 1){

        break;

    }

    else if (*(bigNum + i * MAX + j) == '\n'){

        i += 1;

        j = 0;

    }

    else {

        j += 1;

    }

}

至於具體的原因,有待高手解答...我的C++並不好

 

將break的條件改成以下

if ((*(bigNum + i * MAX + j) == EOF || *(bigNum + i * MAX + j) == '\n' || *(bigNum + i * MAX + j) == ' ') && i == num - 1)

    break;

可以成功AC範例測資,但送出之後會有WA line10的問題

您的答案為: 12318283718923789127389172389172837129837128937128937189237189237891273891723897 ...略
正確答案為: -22222222222222222222222222222222222222222222222222222222222222222222222222

嗯....這樣看起來還是記憶體的問題

自己再看了一下感覺最有可能造成記憶體錯誤的只有陣列越界存取

但還是不清楚是哪裡造成的

再請求各位大神指導了

 
#24512: Re:RE (SIGSEGV) 記憶體區段錯誤! Segmentation fault (core dumped)


jam930725@gmail.com (浮沉沉沉沉沉沉沉沉)

學校 : 國立臺中科技大學
編號 : 124762
來源 : [123.240.115.224]
最後登入時間 :
2022-08-27 13:56:53
a528. 大數排序 | From: [45.148.11.20] | 發表日期 : 2021-02-28 15:55

如題 小弟我在自己的編譯器試過完全沒問題

但丟上來卻一直顯示記憶體區段錯誤

不知道是哪裡發生了問題

以下程式碼

#include

#include

#define MAX 10100

 

void swap(int *,int);

int  arrayLength (char *);

void sort (char *, int);

 

int main(){

    int num;

    while (scanf("%d",&num) != EOF){

        int i=0,j=0;

        char *bigNum;

        bigNum = (char*)calloc(num * MAX, sizeof(char));    //配置大數字串陣列

        if( bigNum == NULL ) {

            fprintf(stderr, "Error: unable to allocate required memory\n");

            return 1;

        }

        //fflush(stdin);

        getchar();

        while (1){

            scanf("%c", bigNum + i * MAX + j);

            if (*(bigNum + i * MAX + j) == '\n' && i == num - 1){

                break;

            }

            else if (*(bigNum + i * MAX + j) == '\n'){

                i += 1;

                j = 0;

            }

            else {

                j += 1;

            }

        }

        sort(bigNum, num);

//        for (int k=0;k<num;k++){

//            for (int l=0;l<MAX;l++){

//                printf("%c",*(bigNum+k*MAX+l));

//            }

//        }

        free (bigNum);

    }

}

 

void swap(int *array,int n){

    int t = array[n];

    array[n] = array[n-1];

    array[n-1] = t;

}

 

int arrayLength (char *array){

    int length = 0;

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

        if (*(array + i) != 0){

            length++;

        }

        else {

            break;

        }

    }

    return length;

}

 

void sort (char *numStr, int num){

    int *sorted, i=1;

    sorted = (int*)calloc(num, sizeof(char));

    for (int x=0; x<num; x++){

        sorted[x] = x;

    }

    while (i < num) {

        int j = 0;

        if (*(numStr + i * MAX + j) == '-'){    //負數比較

            //printf("- i=%d\n",i);

            int k = i;

            while (k > 0){

                if (arrayLength(numStr + sorted[k] * MAX) > arrayLength(numStr + sorted[k-1] * MAX)){   //先比長度

                    swap (sorted,k);

                    //printf("-SWAP L k=%d\n",k);

                }

                else if (arrayLength(numStr + sorted[k] * MAX) == arrayLength(numStr + sorted[k-1] * MAX)){ //長度一樣再比數字

                    //printf("Same L\n");

                    int n = 1;

                    while (n < arrayLength(numStr + sorted[k] * MAX)) {

                        if (*(numStr + sorted[k] * MAX + n) > *(numStr + sorted[k-1] * MAX + n)){

                            swap (sorted,k);

                            //printf("-SWAP N k=%d\n",k);

                        }

                        else if (*(numStr + sorted[k] * MAX + n) < *(numStr + sorted[k-1] * MAX + n)){

                            break;

                        }

                        n++;

                    }

                }

                k--;

            }

        }

        else// 正數比較

            //printf("+ i=%d\n",i);

            int k = i;

            while (k > 0) {

                if (*(numStr + sorted[k-1] * MAX + j) == '-'){

                    break;

                }

                else {

                    if (arrayLength(numStr + sorted[k] * MAX) < arrayLength(numStr + sorted[k-1] * MAX)){   //先比長度

                        swap (sorted,k);

                        //printf("+SWAP L k=%d\n",k);

                    }

                    else if (arrayLength(numStr + sorted[k] * MAX) == arrayLength(numStr + sorted[k-1] * MAX)){ //長度一樣再比數字

                        //printf("Same L\n");

                        int n = 0;

                        while (n < arrayLength(numStr + sorted[k] * MAX)) {

                            if (*(numStr + sorted[k] * MAX + n) < *(numStr + sorted[k-1] * MAX + n)){

                                swap (sorted,k);

                                //printf("+SWAP N k=%d\n",k);

                            }

                            else if (*(numStr + sorted[k] * MAX + n) > *(numStr + sorted[k-1] * MAX + n)){

                                break;

                            }

                            n++;

                        }

                    }

                }

                k--;

            }

        }

        i++;

    }

    for (int x = 0;x < num;x++){

        for (int y = 0;y < MAX;y++){

            printf("%c",*(numStr + sorted[x] * MAX + y));

        }

    }

    free(sorted);

}

 

用範例測資測試了一下,你的程式碼第一組測資可以正常運行,但在第二組測資時,似乎是底下這幾行(第19-31行)產生了記憶體區段錯誤的問題。

while (1){

    scanf("%c", bigNum + i * MAX + j);

    if (*(bigNum + i * MAX + j) == '\n' && i == num - 1){

        break;

    }

    else if (*(bigNum + i * MAX + j) == '\n'){

        i += 1;

        j = 0;

    }

    else {

        j += 1;

    }

}

至於具體的原因,有待高手解答...我的C++並不好

 

將break的條件改成以下

if ((*(bigNum + i * MAX + j) == EOF || *(bigNum + i * MAX + j) == '\n' || *(bigNum + i * MAX + j) == ' ') && i == num - 1)

    break;

可以成功AC範例測資,但送出之後會有WA line10的問題

您的答案為: 12318283718923789127389172389172837129837128937128937189237189237891273891723897 ...略
正確答案為: -22222222222222222222222222222222222222222222222222222222222222222222222222

嗯....這樣看起來還是記憶體的問題

自己再看了一下感覺最有可能造成記憶體錯誤的只有陣列越界存取

但還是不清楚是哪裡造成的

再請求各位大神指導了

這是我參考你的下去修改的code,可以成功AC

#include <stdio.h>

#include <stdlib.h>

#define MAX 105

int len(char *arr){

    int length = 0;

    while(*(arr + length) != 0 && *(arr + length) != '\n' && *(arr + length) != EOF)

        length++;

    return length;

}

void swap(int *array, int n){

    int t = array[n];

    array[n] = array[n-1];

    array[n-1] = t;

}

void sort(char *numStr, int num){

    int *sorted = (int *)calloc(num, sizeof(int));

    for(int k = 0; k < num; k++)

        sorted[k] = k;

    for(int i = num-1; i; i--){// bubble sort

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

            bool isNegative[2];

            isNegative[0] = *(numStr + sorted[j]*MAX) == '-' ? 1 : 0;

            isNegative[1] = *(numStr + sorted[j+1]*MAX) == '-' ? 1 : 0; 

            if(isNegative[0] && !isNegative[1])// numStr[sorted[j]] < numStr[sorted[j+1]]

                continue;

            else if(!isNegative[0] && isNegative[1])// numStr[sorted[j]] > numStr[sorted[j+1]]

                swap(sorted, j+1);

            else{

                int length[] = {len(numStr + sorted[j]*MAX), len(numStr + sorted[j+1]*MAX)};

                if(isNegative[0]){// both of numbers are negative

                    if(length[0] > length[1])// numStr[sorted[j]] < numStr[sorted[j+1]]

                        continue;

                    else if(length[0] < length[1])// numStr[sorted[j]] > numStr[sorted[j+1]]

                        swap(sorted, j+1);

                    else

                        for(int k = 1; k < length[0]; k++)

                            if(*(numStr + sorted[j]*MAX + k) == *(numStr + sorted[j+1]*MAX + k))

                                continue;

                            else if(*(numStr + sorted[j]*MAX + k) > *(numStr + sorted[j+1]*MAX + k))// numStr[sorted[j]] < numStr[sorted[j+1]]

                                break;

                            else{ // numStr[sorted[j]] > numStr[sorted[j+1]]

                                swap(sorted, j+1);

                                break;

                            }

                }else{// both of numbers are positive

                    if(length[0] < length[1])// numStr[sorted[j]] < numStr[sorted[j+1]]

                        continue;

                    else if(length[0] > length[1])// numStr[sorted[j]] > numStr[sorted[j+1]]

                        swap(sorted, j+1);

                    else

                        for(int k = 0; k < length[0]; k++)

                            if(*(numStr + sorted[j]*MAX + k) == *(numStr + sorted[j+1]*MAX + k))

                                continue;

                            else if(*(numStr + sorted[j]*MAX + k) < *(numStr + sorted[j+1]*MAX + k))// numStr[sorted[j]] < numStr[sorted[j+1]]

                                break;

                            else{ // numStr[sorted[j]] > numStr[sorted[j+1]]

                                swap(sorted, j+1);

                                break;

                            }

                }

            }

        }

    }

    for(int i = 0; i < num; i++, putchar_unlocked('\n'))

        for(int j = 0, limit = len(numStr + sorted[i]*MAX); j < limit; j++)

            putchar_unlocked(*(numStr + sorted[i]*MAX + j));

    free(sorted);

}

int main(){

    int num;

    while(~scanf("%d", &num)){

        int i = 0, j = 0;

        char *bigInt = (char *)calloc(num * MAX, sizeof(char));

        getchar_unlocked();

        while(i < num){

            *(bigInt + i * MAX + j) = getchar_unlocked();

            if(*(bigInt + i * MAX + j) == 0 || *(bigInt + i * MAX + j) == '\n' || *(bigInt + i * MAX + j) == EOF)

                i++, j = 0;

            else

                j++;

        }

        sort(bigInt, num);

        free (bigInt);

    }

}

至於WA line10具體的原因個人不清楚,但的確有 12318283718923789127389172389172837129837128937128937189237189237891273891723897... 這行測資。(個人覺得有可能排序也有問題)

MAX的部分,不用開到10100那大,本題最大的數字小於10^100,其位數小於 floor(log10(10^100)) + 1 = 101,我自己是設105

 
#24513: Re:RE (SIGSEGV) 記憶體區段錯誤! Segmentation fault (core dumped)


aetejay@gmail.com (Think Think)

學校 : 不指定學校
編號 : 105293
來源 : [49.216.93.134]
最後登入時間 :
2023-03-20 21:07:14
a528. 大數排序 | From: [101.10.55.12] | 發表日期 : 2021-02-28 17:32

如題 小弟我在自己的編譯器試過完全沒問題

但丟上來卻一直顯示記憶體區段錯誤

不知道是哪裡發生了問題

以下程式碼

#include

#include

#define MAX 10100

 

void swap(int *,int);

int  arrayLength (char *);

void sort (char *, int);

 

int main(){

    int num;

    while (scanf("%d",&num) != EOF){

        int i=0,j=0;

        char *bigNum;

        bigNum = (char*)calloc(num * MAX, sizeof(char));    //配置大數字串陣列

        if( bigNum == NULL ) {

            fprintf(stderr, "Error: unable to allocate required memory\n");

            return 1;

        }

        //fflush(stdin);

        getchar();

        while (1){

            scanf("%c", bigNum + i * MAX + j);

            if (*(bigNum + i * MAX + j) == '\n' && i == num - 1){

                break;

            }

            else if (*(bigNum + i * MAX + j) == '\n'){

                i += 1;

                j = 0;

            }

            else {

                j += 1;

            }

        }

        sort(bigNum, num);

//        for (int k=0;k<num;k++){

//            for (int l=0;l<MAX;l++){

//                printf("%c",*(bigNum+k*MAX+l));

//            }

//        }

        free (bigNum);

    }

}

 

void swap(int *array,int n){

    int t = array[n];

    array[n] = array[n-1];

    array[n-1] = t;

}

 

int arrayLength (char *array){

    int length = 0;

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

        if (*(array + i) != 0){

            length++;

        }

        else {

            break;

        }

    }

    return length;

}

 

void sort (char *numStr, int num){

    int *sorted, i=1;

    sorted = (int*)calloc(num, sizeof(char));

    for (int x=0; x<num; x++){

        sorted[x] = x;

    }

    while (i < num) {

        int j = 0;

        if (*(numStr + i * MAX + j) == '-'){    //負數比較

            //printf("- i=%d\n",i);

            int k = i;

            while (k > 0){

                if (arrayLength(numStr + sorted[k] * MAX) > arrayLength(numStr + sorted[k-1] * MAX)){   //先比長度

                    swap (sorted,k);

                    //printf("-SWAP L k=%d\n",k);

                }

                else if (arrayLength(numStr + sorted[k] * MAX) == arrayLength(numStr + sorted[k-1] * MAX)){ //長度一樣再比數字

                    //printf("Same L\n");

                    int n = 1;

                    while (n < arrayLength(numStr + sorted[k] * MAX)) {

                        if (*(numStr + sorted[k] * MAX + n) > *(numStr + sorted[k-1] * MAX + n)){

                            swap (sorted,k);

                            //printf("-SWAP N k=%d\n",k);

                        }

                        else if (*(numStr + sorted[k] * MAX + n) < *(numStr + sorted[k-1] * MAX + n)){

                            break;

                        }

                        n++;

                    }

                }

                k--;

            }

        }

        else// 正數比較

            //printf("+ i=%d\n",i);

            int k = i;

            while (k > 0) {

                if (*(numStr + sorted[k-1] * MAX + j) == '-'){

                    break;

                }

                else {

                    if (arrayLength(numStr + sorted[k] * MAX) < arrayLength(numStr + sorted[k-1] * MAX)){   //先比長度

                        swap (sorted,k);

                        //printf("+SWAP L k=%d\n",k);

                    }

                    else if (arrayLength(numStr + sorted[k] * MAX) == arrayLength(numStr + sorted[k-1] * MAX)){ //長度一樣再比數字

                        //printf("Same L\n");

                        int n = 0;

                        while (n < arrayLength(numStr + sorted[k] * MAX)) {

                            if (*(numStr + sorted[k] * MAX + n) < *(numStr + sorted[k-1] * MAX + n)){

                                swap (sorted,k);

                                //printf("+SWAP N k=%d\n",k);

                            }

                            else if (*(numStr + sorted[k] * MAX + n) > *(numStr + sorted[k-1] * MAX + n)){

                                break;

                            }

                            n++;

                        }

                    }

                }

                k--;

            }

        }

        i++;

    }

    for (int x = 0;x < num;x++){

        for (int y = 0;y < MAX;y++){

            printf("%c",*(numStr + sorted[x] * MAX + y));

        }

    }

    free(sorted);

}

 

用範例測資測試了一下,你的程式碼第一組測資可以正常運行,但在第二組測資時,似乎是底下這幾行(第19-31行)產生了記憶體區段錯誤的問題。

while (1){

    scanf("%c", bigNum + i * MAX + j);

    if (*(bigNum + i * MAX + j) == '\n' && i == num - 1){

        break;

    }

    else if (*(bigNum + i * MAX + j) == '\n'){

        i += 1;

        j = 0;

    }

    else {

        j += 1;

    }

}

至於具體的原因,有待高手解答...我的C++並不好

 

將break的條件改成以下

if ((*(bigNum + i * MAX + j) == EOF || *(bigNum + i * MAX + j) == '\n' || *(bigNum + i * MAX + j) == ' ') && i == num - 1)

    break;

可以成功AC範例測資,但送出之後會有WA line10的問題

您的答案為: 12318283718923789127389172389172837129837128937128937189237189237891273891723897 ...略
正確答案為: -22222222222222222222222222222222222222222222222222222222222222222222222222

嗯....這樣看起來還是記憶體的問題

自己再看了一下感覺最有可能造成記憶體錯誤的只有陣列越界存取

但還是不清楚是哪裡造成的

再請求各位大神指導了

這是我參考你的下去修改的code,可以成功AC

#include

#include

#define MAX 105

int len(char *arr){

    int length = 0;

    while(*(arr + length) != 0 && *(arr + length) != '\n' && *(arr + length) != EOF)

        length++;

    return length;

}

void swap(int *array, int n){

    int t = array[n];

    array[n] = array[n-1];

    array[n-1] = t;

}

void sort(char *numStr, int num){

    int *sorted = (int *)calloc(num, sizeof(int));

    for(int k = 0; k < num; k++)

        sorted[k] = k;

    for(int i = num-1; i; i--){// bubble sort

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

            bool isNegative[2];

            isNegative[0] = *(numStr + sorted[j]*MAX) == '-' ? 1 : 0;

            isNegative[1] = *(numStr + sorted[j+1]*MAX) == '-' ? 1 : 0; 

            if(isNegative[0] && !isNegative[1])// numStr[sorted[j]] < numStr[sorted[j+1]]

                continue;

            else if(!isNegative[0] && isNegative[1])// numStr[sorted[j]] > numStr[sorted[j+1]]

                swap(sorted, j+1);

            else{

                int length[] = {len(numStr + sorted[j]*MAX), len(numStr + sorted[j+1]*MAX)};

                if(isNegative[0]){// both of numbers are negative

                    if(length[0] > length[1])// numStr[sorted[j]] < numStr[sorted[j+1]]

                        continue;

                    else if(length[0] < length[1])// numStr[sorted[j]] > numStr[sorted[j+1]]

                        swap(sorted, j+1);

                    else

                        for(int k = 1; k < length[0]; k++)

                            if(*(numStr + sorted[j]*MAX + k) == *(numStr + sorted[j+1]*MAX + k))

                                continue;

                            else if(*(numStr + sorted[j]*MAX + k) > *(numStr + sorted[j+1]*MAX + k))// numStr[sorted[j]] < numStr[sorted[j+1]]

                                break;

                            else{ // numStr[sorted[j]] > numStr[sorted[j+1]]

                                swap(sorted, j+1);

                                break;

                            }

                }else{// both of numbers are positive

                    if(length[0] < length[1])// numStr[sorted[j]] < numStr[sorted[j+1]]

                        continue;

                    else if(length[0] > length[1])// numStr[sorted[j]] > numStr[sorted[j+1]]

                        swap(sorted, j+1);

                    else

                        for(int k = 0; k < length[0]; k++)

                            if(*(numStr + sorted[j]*MAX + k) == *(numStr + sorted[j+1]*MAX + k))

                                continue;

                            else if(*(numStr + sorted[j]*MAX + k) < *(numStr + sorted[j+1]*MAX + k))// numStr[sorted[j]] < numStr[sorted[j+1]]

                                break;

                            else{ // numStr[sorted[j]] > numStr[sorted[j+1]]

                                swap(sorted, j+1);

                                break;

                            }

                }

            }

        }

    }

    for(int i = 0; i < num; i++, putchar_unlocked('\n'))

        for(int j = 0, limit = len(numStr + sorted[i]*MAX); j < limit; j++)

            putchar_unlocked(*(numStr + sorted[i]*MAX + j));

    free(sorted);

}

int main(){

    int num;

    while(~scanf("%d", &num)){

        int i = 0, j = 0;

        char *bigInt = (char *)calloc(num * MAX, sizeof(char));

        getchar_unlocked();

        while(i < num){

            *(bigInt + i * MAX + j) = getchar_unlocked();

            if(*(bigInt + i * MAX + j) == 0 || *(bigInt + i * MAX + j) == '\n' || *(bigInt + i * MAX + j) == EOF)

                i++, j = 0;

            else

                j++;

        }

        sort(bigInt, num);

        free (bigInt);

    }

}

至於WA line10具體的原因個人不清楚,但的確有 12318283718923789127389172389172837129837128937128937189237189237891273891723897... 這行測資。(個人覺得有可能排序也有問題)

MAX的部分,不用開到10100那大,本題最大的數字小於10^100,其位數小於 floor(log10(10^100)) + 1 = 101,我自己是設105


那我會再測試一下

感謝指導

 
ZeroJudge Forum