此页突出显示哪些编程错误?

时间:2009-08-09 06:31:30

标签: c

http://dspace.dial.pipex.com/town/green/gfd34/art/bloopers.html

第一个似乎很简单;

return strcpy(malloc(strlen(s)), s);

malloc可以返回nullstrcpy可以尝试将数据复制到内存地址0.或者s可以是指向字符串(而不是数组)的指针,{ {1}}只会为指针分配足够的空间,并尝试将字符串复制到其中。 (我想)。

第二个怎么样?

  

当他写下ch = toupper(ch);

时,他没有给无符号字符添加ch真是太可惜了

如果您撰写malloc,为什么要将ch投放到unsigned char

4 个答案:

答案 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}}。