strcat эксцентричное поведение - PullRequest
3 голосов
/ 16 августа 2011

Я написал эту простую C-программу и не мог понять причудливое поведение strcat

long sum(long col, char* path, char* path2){

    printf("%s\n",path2);
    strcat(path,".endlines");
    printf("%s\n",path2);
    return 0;
}

int main(int argc, char* argv[]) {
    int n=atoi(argv[1]);
    sum(n,argv[2],argv[3]);
    exit(EXIT_SUCCESS);
}

strcat применяется к пути, но путь2 в конечном итоге также изменяется. Я был бы очень признателен, если бы кто-нибудь дал мне знать, что происходит :) спасибо

Run

. / Пример программы 3 / mountdir / location2.csv Пример / RootDir / location2.csv

выход:

Пример / RootDir / location2.csv

1017 * лицевые линии *

Ответы [ 2 ]

5 голосов
/ 16 августа 2011

Вы переполняете буфер. Исходные argv [2] и argv [3] очень вероятно последовательны в памяти. Когда вы strcat в конце argv [2], он записывает в память argv [3] указывает на. Вам нужно выделить новые буферы для хранения больших строк, которые вы пытаетесь создать.

3 голосов
/ 16 августа 2011

Во-первых, вы не можете писать в argv [2].(при этом получается поведение, которое зависит от реализации или не определено. Различие неважно: не делайте этого).

Second;где путаница?Возможно, у вас есть память, расположенная с argv [2] сразу после argv [1], поэтому она выглядит как «example / mountdir / location2.csv \ 0example / rootdir / location2.csv».argv [2] (path) указывает на первое 'e', ​​а path2 указывает на 'e' после нулевого байта.Когда вы указываете путь к пути, вы пишете данные, начиная с \ 0, поэтому \ 0 заменяется на '.', 'E' заменяется на 'e' конечных линий и т. Д., И теперь path2 указывает на вторуюсимвол строки '.endlines', поэтому вы печатаете ее и получаете выходные данные "endlines".

...