c中的分段故障使用静态数组内存分配。

时间:2016-07-17 01:31:09

标签: c segmentation-fault

        #include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>
void f(char a[], int n, int k, int l);

int main(){
    int n; 
    int k; 
    scanf("%d %d",&n,&k);
    char number[100000];
    scanf("%s",number);
    int l= 0;
    if( n%2 == 0) f(number,n,k,l);
    else {l = 1;f(number,n,k,l);}
    return 0;
}
void f(char a[], int n, int k, int l) {
    int c = 0;
    for( int i = 0; i <= n/2; i++) {
        if( a[n/2 - 1 - i] > a[n/2 + l + i]) {a[n/2 + l + i] = a[n/2 - 1 - i];c++;}
        if( a[n/2 - 1 - i] < a[n/2 + l + i]) {a[n/2 - 1 - i] = a[n/2 + l + i]; c++;}
        if( c > k) {printf("-1"); break;}
    }
    if( c <= k) {
        int i = 0;
    while( c != k || c != (k-1)) {
        if( a[i] != 57) { a[i] = 57; a[n-1-i] = 57; c+=2;} 
        i++;
    }
        if(c == k-1 && n%2 == 1) a[n/2] = 57;
        printf("%s", a);
    }
    return;
}

我试图通过改变k个字符来制作一个长度为n的回文串,并使数字尽可能大。 对于前 输入:4 1         3943 输出:3993 输入:6 3         092282 输出:992299 请引导我分析故障及其原因。 非常感谢:D

1 个答案:

答案 0 :(得分:1)

中使用的条件
while( c != k || c != (k-1)) {

错了。它永远都是真的。由于该错误,i不断增加,您最终访问a越界。

您需要使用&&代替||

while( c != k && c != (k-1)) {
             ^^^^