基本上我在下面的代码中有两个问题:
const char *x = "abc";
const char *y = "def";
char *res = (char*)malloc(0);
char *z = res;
while (*z++ = *x++);
z--; // remove \0
while (*z++ = *y++);
printf("%s\n", res); // output: abcdef
free(res);
Run Code Online (Sandbox Code Playgroud)
此代码的目的是在一个中添加两个字符串.但是这条线while (*z++ = *x++);如何起作用boolean 1/0,为什么我甚malloc(0);至将它设置为零它也运行良好没有任何问题?
小智 6
但是这条线
while (*z++ = *x++);如何充当布尔值1/0
这是因为在C中,赋值是一个表达式,它的计算结果为赋值.当*x到达最终'\0'终止符时,它将计算到0,因此false在布尔上下文中.
由于错误输入,这是一个很好的错误来源:
if (x = 1) // always true, as a side effect assigns 1 to x
Run Code Online (Sandbox Code Playgroud)
为什么我甚至设置
malloc(0);为零它也运行良好没有任何问题?
使用malloc(0)写入值的返回值是未定义的并且"意外地工作".您请求零字节,因此永远不允许您写入此分配,malloc()甚至可以返回空指针.
引用自己的未定义行为:
未定义的行为
CC是一种非常低级的语言,其结果如下:
什么都不会阻止你做一些完全错误的事情.
许多语言,尤其是对一些管理的环境像
Java或C#真正停止时,你做的事情,是不允许的,比如,访问不存在的数组元素.C没有.只要你的程序在语法上是正确的,编译器就不会抱怨.如果您在程序中执行了某些禁止操作,则C只需调用程序的行为未定义.这正式允许在运行程序时发生任何事情.通常,结果将是崩溃或仅输出"垃圾"值,如上所示.但是如果你真的不走运,那么你的程序似乎工作得很好,直到它得到一些稍微不同的输入,到那时,你将很难找到你的程序 未定义的地方.因此,一定要避免未定义的行为!.另外,未定义的行为也会导致安全漏洞.这在实践中发生了很多.