9

我试图理解以下代码,但我在"\0"和之间感到困惑'\0'。我知道它很愚蠢但请帮助我

   #define MAX_HISTORY 20

   char *pStr = "\0";
   for(x=0;x<MAX_HISTORY;x++){
        str_temp = (char *)malloc((strlen(pStr)+1)*sizeof(char));
        if (str_temp=='\0'){
            return 1;
    }
    memset(str_temp, '\0', strlen(pStr) );
    strcpy(str_temp, pStr);
4

3 回答 3

12

它们不一样。

"\0"是一个字符串文字,它有两个连续的 0,大致相当于:

const char a[2] = { '\0', '\0' };

'\0'是一个int值为 0 的值。您可以在任何需要使用的地方始终为 0 '\0'

于 2016-10-19T10:55:51.847 回答
10

双引号创建字符串文字。"\0"包含单个字符的字符串文字也是如此'\0',加上第二个作为终止符。写一个空字符串是一种愚蠢的方式(""是惯用的方式)。

单引号用于字符文字,因此'\0'是一个int-sized 值,表示编码值为 0 的字符。

代码中的尼特:

  • 不要malloc()在 C中转换返回值。
  • 不要按比例分配分配 sizeof (char),它始终是 1,所以它没有增加任何价值。
  • 指针不是整数,您NULL通常应该进行比较。
  • 代码的整个结构毫无意义,循环中有分配,但指针被丢弃,泄漏了大量内存。
于 2016-10-19T10:56:51.973 回答
6

\0是空终止符。

"\0"是一样的{'\0', '\0'}。它是由一个困惑的程序员编写的字符串,他不明白字符串文字总是自动终止的。正确编写的代码应该是"".

这条线if (str_temp=='\0')是胡说八道,它应该是if (str_temp==NULL)。现在碰巧,\0等于 0,它是一个空指针常量,所以代码可以正常工作,幸运的是。

获取第一个字符strlen的字符串\0不是很有意义。您将获得字符串长度为零。

于 2016-10-19T10:56:23.233 回答