"\0"和'\0'的区别

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);

char *pStr = "\0"; 我猜这不是你想要的。你声明了一个指针并在其中写入了一些内容。那将是它所指向的地址。在那里使用 malloc,之后填充分配的内存。或者你可以在那里使用字符数组。 - Kami Kaze
2
@KamiKaze 我猜 char *pStr = "\0"; 不是你想的那样。它声明了一个指针,其值是包含两个空字节的字符串文字的地址。不需要使用 malloc 来正确执行。 - Jean-Baptiste Yunès
@Jean-BaptisteYunès 嗯,你让我思考了。这两个空字节所在的内存的寿命是多久? - Kami Kaze
1
@KamiKaze 字符串字面量具有静态存储期(参见标准6.4.5/6)。 - Jean-Baptiste Yunès
3个回答

12

它们是不同的。

"\0" 是一个字符串字面量,包含两个连续的 0,并且大致等价于:

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

'\0'是一个值为0的int类型。你可以在任何需要使用'\0'的地方都使用0。


10

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

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

代码中的问题:

  • 在C中不需要转换malloc()的返回值。
  • 不要通过sizeof(char)缩放分配量,因为它始终为1,所以没有任何价值。
  • 指针不是整数,通常应与NULL进行比较。
  • 代码的整个结构毫无意义,循环中有一次分配但是指针被丢弃,导致内存泄漏。

1
别忘了注意内存泄漏问题(在循环中覆盖分配的内存引用)。 - Klas Lindbäck
1
不使用sizeof(char)在malloc中是一种非常主观的风格观点,我不明白为什么人们会一直提到这一点。人们可能会显式地输入sizeof(char),因为他们想要一个一致的编码风格,无论类型如何都调用malloc作为malloc(n * sizeof(type))。这增加了自我记录代码的价值。反对这一点就像说我们不应该写char* ptr = malloc(n*sizeof(*ptr))而是重写为char* ptr = malloc(n),但只有当类型是char时才这样做。 - Lundin
这不是一种愚蠢的创建空字符串的方式,因为它并没有创建一个空字符串。它只是创建了一个不是字符串的字符串字面量,请参见6.4.5/6注释78。 - Jean-Baptiste Yunès
1
公正地说,许多C程序员甚至不知道sizeof(char)定义为1。 - Andrew Henle
1
@ChrisTang 是的,因为 '\0' 充当终止符,所以它不会被计算在内。在内存中,"" 将是一个单一的 '\0',当您显式包含它时,它将被加倍,但从 strlen() 的角度来看这并不重要。 - unwind
显示剩余2条评论

6

\0是空终止字符。

"\0"{'\0', '\0'}相同。这是一个被困惑的程序员编写的字符串,他不明白字符串字面值总是自动以空终止符结束的。正确编写的代码应该是""

if (str_temp=='\0')是无意义的,应该是if (str_temp==NULL)。现在碰巧,\0等同于0,这是一个空指针常量,所以代码运行了,但只是侥幸。

对一个以\0作为第一个字符的字符串使用strlen并没有太多意义。你将得到长度为零的字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接