main()
{
const char **a = {"string1","string2"};
printf("%c", *a); /* prints s */
printf("%s", a); /* prints string1 */
printf("%s", a+1);/* prints ng1 */
}
GCC v4.8.3 отпечатки "% s" для последнего Printf, где, как http://codepad.org/ печатает "NG1".Const символ ** а = { "string1", "строка2"} и указатель arithametic
Я думал, что код создаст массив указателей на две строки и базовый адрес, присвоенный a, что позволяет использовать обычную арифметику указателя. но, похоже, что-то не так с предположением. Первый printf предполагает, что мое предположение неверно. может ли кто-нибудь объяснить, почему такое поведение наблюдается? (обратите внимание, что VS 2012 выложил ошибку, в которой говорилось слишком много инициаторов, где GCC выдает предупреждение о несовместимом назначении указателя). Я знаю предупреждение из-за несовместимого назначения указателя.
'const char ** a = {" string1 "," string2 "};' неверно. Ваш 'main()' не возвращает 'int', что также неверно. Пожалуйста, прочитайте о указателях и массивах, прежде чем предполагать, что вы должны писать. –
Вопрос не в абсолютной правильности моей программы, обратите внимание, что это юридическая программа, составленная GCC v4.8.3 с предупреждением. вопросы касаются того, почему поведение странно. –
@bare_metal это не юридическая программа. Обработка gcc этим не меняет этот факт –