【发布时间】:2015-02-08 14:11:01
【问题描述】:
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 为最后一个 printf 打印“%s”,而 http://codepad.org/ 打印“ng1”。
我认为代码将创建一个指向两个字符串的指针数组,并将基地址分配给 a,这允许正常的指针运算。但似乎假设有问题。第一个 printf 表明我的假设是错误的。谁能解释为什么会观察到这种行为? (请注意,VS 2012 抛出了一个错误,指出太多初始化器,而 GCC 抛出了不兼容指针分配的警告)。由于指针分配不兼容,我知道警告。
【问题讨论】:
-
const char **a = {"string1","string2"};是错误的。您的main()不返回int这也是错误的。在假设你写的东西应该可以工作之前,请阅读指针和数组。 -
问题不是关于我的程序的绝对正确性,请注意这是一个由 GCC v4.8.3 编译的合法程序,带有警告。问题是关于为什么这种行为很奇怪。
-
@bare_metal 这不是一个合法的程序。 gcc 的处理方式并没有改变这一事实