http://dspace.dial.pipex.com/town/green/gfd34/art/bloopers.html
第一个似乎很简单;
return strcpy(malloc(strlen(s)), s);
malloc
可以返回null
,strcpy
可以尝试将数据复制到内存地址0.或者s可以是指向字符串(而不是数组)的指针,{ {1}}只会为指针分配足够的空间,并尝试将字符串复制到其中。 (我想)。
第二个怎么样?
当他写下ch = toupper(ch);
时,他没有给无符号字符添加ch真是太可惜了
如果您撰写malloc
,为什么要将ch
投放到unsigned char
?
答案 0 :(得分:6)
第一个似乎很简单;的malloc 可以返回null,strcpy可以 尝试将数据复制到内存地址0。 或者s可以是指向字符串的指针 (而不是数组)和malloc 只会为a分配足够的空间 指针,并试图复制一个 串入它。 (我想)。
够简单吧?你错过了最明显的错误:你没有分配足够的空间。 strcpy()
复制字符串加上终止空字节,因此目标缓冲区的大小必须至少比字符串的长度大1。
答案 1 :(得分:3)
toupper
函数(小写U)取值为unsigned char或EOF。如果char已签名,则将char传递给toupper()而不将其转换为unsigned char,则可以传递具有未定义行为的其他值。 toupper的实现通常如下所示:
int toupper(int c)
{
return touppermap[c+1];
}
所以这里的问题是真的。 (这个实现假设EOF是-1,你不能正式做,但没有什么能阻止实现了解它自己的特性)。
答案 2 :(得分:1)
toupper()函数期望其输入为unsigned char(0 - 255)范围内的整数,而在某些情况下,char变量可以在signed char(-128 - 127)的范围内。
答案 3 :(得分:1)
toupper
函数期望参数可以作为unsigned char
或值EOF
来表示。如果您没有将signed char
强制转换为unsigned char
,那么高于127的int
将被视为负数,而该参数为{{1}}。