Функция, подобная void function(char*s)
, ожидает указатель на правильно распределенный объект (или NULL, чтобы сделать явным, что ничего действительного не было передано).Существует несколько способов выделения объекта: один - malloc
, другой - объект с автоматической или статической продолжительностью хранения.
Но есть по крайней мере одна вещь, которую вы не должны делать: передать указатель, который являетсяне инициализирован;этот указатель может указывать на «где-то» и в этом случае приводит к неопределенному поведению:
void function(char*s) {
if (s != NULL) { // valid?
strcpy(s,"Hello world!");
}
}
int main() {
char s1[20]; // automatic storage duration
char s2[] = "some initil value"; // automatic storage duration
static char s3[30]; // static storage duration
char *s4 = malloc(30); // dynamic storage duration
function(s1);
function(s2);
function(s3);
function(s4);
function(NULL); // explicitly something NOT pointing to a valid object
free(s4); // deallocate object with dynamic storage duration
// don't do that:
char* s5; // s5 is not initiaized
function(s5); // -> undefined behaviour
}