Мы знаем, что strcat () получает указатель на целевой массив в качестве параметров и объединяет их с исходной строкой. Массив назначения должен быть достаточно большим, чтобы хранить объединенный результат. Недавно я обнаружил, что strcat () по-прежнему может выполняться должным образом для небольших программ, даже когда целевой массив недостаточно велик для добавления второй строки. Я начал серфить в stackoverflow и обнаружил пару -
ответов на этот вопрос. Я хочу углубиться и понять, что именно происходит на аппаратном уровне, когда я запускаю этот код ниже?
#include<iostream>
#include<iomanip>
#include<cmath>
#include<cstring>
using namespace std;
int main(){
char p[6] = "Hello";
cout << "Length of p before = " << strlen(p) << endl;
cout << "Size of p before = " << sizeof(p) << endl;
char as[8] = "_World!";
cout << "Length of as before = " << strlen(as) << endl;
cout << "Size of as before = " << sizeof(as) << endl;
cout << strcat(p,as) << endl;
cout << "After concatenation:" << endl;
cout << "Length of p after = " << strlen(p) << endl;
cout << "Size of p after = " << sizeof(p) << endl;
cout << "Length of as after = " << strlen(as) << endl;
cout << "Size of as after = " << sizeof(as) << endl;
return 0;
}
После выполнения этого кода длина массива p [] равна 12, а размер p [] равен 6. Как физически такая длина может быть сохранена для такого размера массива? Я имею в виду, что для этого массива количество байтов ограничено, значит ли это, что функция strlen (p) ищет только терминатор NULL и продолжает считать до тех пор, пока не найдет его и проигнорирует фактический выделенный размер этого массива. И функции sizeof () действительно все равно, хранит ли последний элемент массива, специально выделенный для нулевого символа, нулевой символ или нет.