Требует ли strcat_s() использования realloc()?

Возьмите пример кода *:

char *string = (char*)malloc(sizeof(char));
strcat_s(string, strlen(string) + 10 + 1, "characters");

Приведенный выше код компилируется и запускается, что наводит меня на мысль, что происходит перераспределение памяти. Однако, когда применяется в большем масштабе (также рекурсивно), я получаю ошибки памяти в случайных местах (разные при каждом запуске программы).

Может ли strcat_s() превышать границы? Следовательно, требуется ли realloc() для обеспечения правильного распределения памяти?

Примечание. Может случиться так, что ошибки не связаны, хотя они случайно появляются после применения кода из примера.

* Причина, по которой я изначально выделил только один байт, заключается в том, что контекстуально я работаю с динамическими размерами, поэтому размер string изменится, но на неизвестную сумму.

2 ответа

Приведенный выше код компилируется и запускается, что наводит меня на мысль, что происходит перераспределение памяти.

То, что программа ведет себя так, как вы ожидаете, не означает, что она правильная или что ее поведение вообще определено с точки зрения Си.

Однако, когда применяется в большем масштабе (также рекурсивно), я получаю ошибки памяти в случайных местах (разные при каждом запуске программы).

Мог strcat_s() превышать границы?

Да.

Является realloc() поэтому требуется, чтобы память была правильно распределена?

Нет.

ни strcat_s() ни strcat() выполняет любое перераспределение. Они не указаны для этого, и было бы небезопасно для них.

Вы получаете ошибки, потому что используете функцию неправильно (даже если вы не получаете ошибок). Вы несете ответственность за то, чтобы второй аргумент не превышал размер массива, на который указывает первый, но вы явно игнорируете эту ответственность. Я полагаю, у вас просто есть серьезное недоразумение о том, что strcat_s() должен делать, и что означает его второй параметр.

Главное, что strcat_s() обеспечивает, но strcat() not проверяет, что указанные границы массива не переполняются из-за того, что вторая строка длиннее, чем может быть размещена. Это освобождает вас от проверки длины второй строки перед выполнением конкатенации, что выгодно, потому что strcat_s() может сделать это самому по очень низкой цене, так как он должен сканировать эту строку в любом случае. strcat_s() не имеет большей возможности, чем любая другая операция или функция C, независимо определять, как долго массив, на который указывает первый аргумент. Это зависит от вас, чтобы сказать это.

Если вам необходимо обеспечить динамическую настройку размера вашего массива, вы несете ответственность за отслеживание текущего размера выделения.

Здесь вы выделяете ровно 1 символ

 char *string = (char*)malloc(sizeof(char));

поэтому единственная строка string может держать это "" (строка нулевой длины)

Затем вы пытаетесь добавить строку "characters" в string который не может содержать строку, кроме "" и который не инициализирован. Кроме того, результат strlen(string) будет неопределенным, потому что снова string не инициализируется.

 strcat_s(string, strlen(string) + 10 + 1, "characters");

Вы, вероятно, хотите это:

char *string = (char*)malloc(sizeof(char) * 100);   // allocate 100 bytes
strcpy(string, "Hello ");
strcat_s(string, 100, "characters");

printf("%s\n", string);  // will display "Hello characters".
Другие вопросы по тегам