Ore*_*lom 4 c string null printf
在编写一些字符串数组的初始化列表时,我不小心错过了一个冒号,这使我观察到printf可以成功打印无效的(0x0)字符串。这是我的C文件:
#include <stdio.h>
const char *names[3]=
{
"a",
"b" // missing colon here made names[1] == "bc"
"c"
};
int main(int argc, char **argv)
{
printf("name [2] = %s",names[2]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我编译并执行它时,我得到的name [2] = (null)是“怪异的”,因为我认为仅仅崩溃应用程序才有意义,不是吗?我很难找到它的原因是因为我使用的某些字符串不是"b","c"而是诸如的单词null,nothing等等。
我的问题是:(1)为什么没有发出警告?(2)printf这种默认行为为何产生?
这里的问题是初始化程序中的字符串连接!在代码中:
const char *names[3]=
{
"a",
"b" // missing colon here made names[1] == "bc"
"c"
};
Run Code Online (Sandbox Code Playgroud)
文字"b"和"c"将被串联为一个值,"bc"因此,names[]数组的第三个元素将被初始化为零(空指针)。
没有警告,因为这样的字符串初始化是完全合法的C代码。
您的代码实际上是:
const char *names[3]=
{
"a",
"bc"
};
Run Code Online (Sandbox Code Playgroud)
依次与以下内容相同:
const char *names[3]=
{
"a",
"bc",
NULL
};
Run Code Online (Sandbox Code Playgroud)
此外,如注释(pmg和David C. Rankin)中所述,printf("%s", x)"when x是空指针的行为是未定义的行为。正如Aconcagua所指出的那样,许多(或大多数)编译器将按照您的方式进行,并打印{null}或类似的东西。但是某些系统可能会崩溃。
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |