"\0" 和 '\0' 的区别
difference between "\0" and '\0'
我试图理解以下代码,但我对 "[=11=]"
和 '[=12=]'
感到困惑。我知道这很愚蠢,但请帮助我
#define MAX_HISTORY 20
char *pStr = "[=10=]";
for(x=0;x<MAX_HISTORY;x++){
str_temp = (char *)malloc((strlen(pStr)+1)*sizeof(char));
if (str_temp=='[=10=]'){
return 1;
}
memset(str_temp, '[=10=]', strlen(pStr) );
strcpy(str_temp, pStr);
它们是不同的。
"[=11=]"
是一个字符串文字,它有两个连续的 0,大致等同于:
const char a[2] = { '[=10=]', '[=10=]' };
'[=12=]'
是一个值为 0 的 int
。您可以在任何需要使用 '[=12=]'
.
的地方始终为 0
[=10=]
是空终止符。
"[=11=]"
等同于 {'[=12=]', '[=12=]'}
。这是一个困惑的程序员编写的字符串,他不明白字符串文字总是自动以 null 终止。正确编写的代码应该是 ""
.
第if (str_temp=='[=14=]')
行是废话,应该是if (str_temp==NULL)
。现在碰巧,[=10=]
等价于 0,这是一个空指针常量,所以代码可以运行,很幸运。
取 strlen
一个字符串,其中 [=10=]
是第一个字符不是很有意义。您将得到字符串长度为零。
双引号创建字符串文字。所以 "[=10=]"
是一个字符串文字,包含单个字符 '[=11=]'
,加上第二个字符作为终止符。写一个空字符串是一种愚蠢的方式(""
是惯用的方式)。
单引号用于字符文字,因此 '[=11=]'
是一个 int
大小的值,表示编码值为 0 的字符。
代码中的尼特:
- 不要在 C 中转换
malloc()
的 return 值。
- 不要按
sizeof (char)
缩放分配,它始终为 1,因此不会增加任何价值。
- 指针不是整数,您通常应该与
NULL
进行比较。
- 代码的整个结构没有意义,循环中有一个分配但指针被丢弃,泄漏了大量内存。
我试图理解以下代码,但我对 "[=11=]"
和 '[=12=]'
感到困惑。我知道这很愚蠢,但请帮助我
#define MAX_HISTORY 20
char *pStr = "[=10=]";
for(x=0;x<MAX_HISTORY;x++){
str_temp = (char *)malloc((strlen(pStr)+1)*sizeof(char));
if (str_temp=='[=10=]'){
return 1;
}
memset(str_temp, '[=10=]', strlen(pStr) );
strcpy(str_temp, pStr);
它们是不同的。
"[=11=]"
是一个字符串文字,它有两个连续的 0,大致等同于:
const char a[2] = { '[=10=]', '[=10=]' };
'[=12=]'
是一个值为 0 的 int
。您可以在任何需要使用 '[=12=]'
.
[=10=]
是空终止符。
"[=11=]"
等同于 {'[=12=]', '[=12=]'}
。这是一个困惑的程序员编写的字符串,他不明白字符串文字总是自动以 null 终止。正确编写的代码应该是 ""
.
第if (str_temp=='[=14=]')
行是废话,应该是if (str_temp==NULL)
。现在碰巧,[=10=]
等价于 0,这是一个空指针常量,所以代码可以运行,很幸运。
取 strlen
一个字符串,其中 [=10=]
是第一个字符不是很有意义。您将得到字符串长度为零。
双引号创建字符串文字。所以 "[=10=]"
是一个字符串文字,包含单个字符 '[=11=]'
,加上第二个字符作为终止符。写一个空字符串是一种愚蠢的方式(""
是惯用的方式)。
单引号用于字符文字,因此 '[=11=]'
是一个 int
大小的值,表示编码值为 0 的字符。
代码中的尼特:
- 不要在 C 中转换
malloc()
的 return 值。 - 不要按
sizeof (char)
缩放分配,它始终为 1,因此不会增加任何价值。 - 指针不是整数,您通常应该与
NULL
进行比较。 - 代码的整个结构没有意义,循环中有一个分配但指针被丢弃,泄漏了大量内存。