Линия:
cond = (char *)malloc(sizeof(char));
выделяет ровно один char
для хранения, в которое вы затем копируете более одного - strcpy
необходимо поставить, как минимум, нулевой терминатор, но, в вашем случае, также результаты вашего strtok
а также.
Причина, по которой это может работать в другой системе, заключается в том, что некоторые реализации malloc
будут выделять с определенным разрешением (например, кратным 16 байтам) независимо от того, какое фактическое значение вы запрашиваете, поэтому у вас может быть некоторое свободное место там в конце вашего буфера. Но то, что вы пытаетесь, все еще очень неопределенное поведение.
Тот факт, что неопределенное поведение может работать иногда, никоим образом не отменяет вашей ответственности за избежание такого поведения.
Выделите достаточно места для хранения результатов вашего strtok
, и с вами все будет в порядке.
Самый безопасный способ сделать это - динамически распределять пространство так, чтобы оно было как минимум таким же большим, как строка, которую вы передаете strtok
. Таким образом, не может быть возможности переполнения (кроме странных крайних случаев, когда другие потоки могут изменять данные за вашей спиной, но, если бы это было так, strtok
был бы очень плохим выбором в любом случае).
Что-то вроде (если instr
ваша исходная строка ввода):
cond = (char*)malloc(strlen(instr)+1);
Это гарантирует, что любой токен, извлеченный из instr
, будет соответствовать cond
.
Кроме того, sizeof(char)
всегда равно 1 по определению, поэтому вам не нужно умножать его на *. 1030 *