Язык C, массив символов поврежден (?) - PullRequest
0 голосов
/ 22 сентября 2019

Я ничего не делаю с массивом org, но когда вижу результат.Массив 'org' изменен с банана на банан.Я думаю, это вызвано повреждением памяти или чем-то, но я не знаю, что именно не так.Как я могу исправить содержимое массива org char?

#include <stdio.h>
#include <string.h>

char org[];
int N;
char clue[1010][110];
int arrest[1010];

void solve(){ // Core function
    char* copy;
    int len_org, len_clue, tmp=0, cnt=0;
    int i, j;

    len_org = strlen(org);
    //printf("len_org = %d\n", len_org);

    for(i=0; i<N; i++){
        //copy = org;
        //memset(copy, 0, strlen(len_org));
        //printf("org = %s\n", org);
        copy = org;
        cnt = 0;
        printf("first copy = %s, org = %s\n", copy, org);
        len_clue = strlen(clue[i]);
        printf("len_clue = %d\n", len_clue);
        tmp = len_org - len_clue;
        for(j=0; j<=tmp; j++){
            printf("clue[i] = %s, copy = %s\n", clue[i], copy);
            if(!strncmp(copy, clue[i], len_clue)){
                cnt++;
                printf("cnt = %d\n", cnt);
            }
            copy++;
            printf("copy = %s, org = %s\n", copy, org);
        }
        printf("final cnt = %d\n\n", cnt);
        arrest[i] = cnt;
    }

    /*for(i=0; i<N; i++)
        printf("%s\n", clue[i]);*/
}

void inputData(){
    int i;
    scanf("%s", org);
    scanf("%d", &N);
    for(i=0; i<N; i++){
        scanf("%s", clue[i]);
    }
}

int main() {
    inputData();
    solve();
    return 0;
}

1 Ответ

0 голосов
/ 22 сентября 2019

Компиляция кода с помощью gcc (7.3) выявляет проблему:

cc a.c
a.c:4:6: warning: array ‘org1’ assumed to have one element
 char org1[];
      ^~~~

На практике (gcc 7.3) org помещается между переменными clue и arrset (global).Как видно из 'nm a.out' - арест начинается через 4 байта после org, поэтому эффективный размер 'org' равен 4.

Вывод из: nm a.out |сортировка

0000000000201040 B N
0000000000201060 B clue
000000000021c25c B org
000000000021c260 B arrest
000000000021d228 B _end
...