- - это malloc (), необходимый для char * [] `
В C ++ вряд ли когда-либо понадобится malloc.
В C обычно требуется malloc, но только если вам нужно динамически распределять.
В общем случае наличие символа * [] не означает, что вам обязательно нужно динамическое размещение и, следовательно, нет необходимости в malloc.
если я не использую malloc для каждого элемента массива str [], то было бы неправильно назначать строку без выделения памяти для этой строки?
Символ * не должен указывать на память, выделенную с помощью malloc. Например, он может указывать непосредственно на строковый литерал (только в C; в C ++ вам нужен указатель на const). Или это может указывать на память в стеке.
не символ * ул; strcpy (str, "sample") неправильно, если я не выделяю память для str через malloc?
Это неправильно, но не потому, что вы не используете malloc. Это неправильно, потому что вы передаете неинициализированный указатель в strcpy. Поэтому поведение не определено. Это не имеет ничего общего с malloc.
- не сможет strcmp ...
Непонятно, что вы подразумеваете под "неудачей". Нет выходных данных, которые означают сбой или ошибку. Для некоторых входных данных поведение не определено. В то время как неопределенное поведение является ошибкой программиста, нет гарантии поведения, которое вы могли бы считать ошибочным.
... если я установил значение 0?
Если вы передадите указатель на strcmp, который не является указателем на строку с нулевым символом в конце, то поведение программы не определено.
В программе, которую вы показываете, вы заканчиваете тем, что передаете неинициализированный указатель или тот, у которого memset был установлен в 0, и поэтому нет гарантии, что они будут указателем на завершенную нулем строку. Поэтому поведение программы не определено.
Я передаю указатель, указывающий на 0 (ноль), поэтому разыменование не должно сталкиваться с проблемой отсутствия строки с нулевым символом в конце, так как мы ничего не храним в нулевом местоположении
Memset в 0 не гарантируется равным нулю, что касается стандарта. Даже если в вашей системе, вероятно, указано значение null, 10 байтов, вероятно, недостаточно для 4 указателей в этой системе, как указывает @ChristianGibbons, так что вы фактически не инициализировали все указатели вообще.
Даже если вы инициализировали указатели на null, нулевой указатель не является указателем на строку с нулевым окончанием, и, следовательно, передача нулевого указателя в strcmp имеет неопределенное поведение.