【发布时间】:2022-09-23 16:29:42
【问题描述】:
char *s1 = \"\";
char *s2 = NULL;
我只想知道区别
-
这是一个类比:imgur.com/Af7I80M
-
@Raildex 有趣但不是很有教育意义。在 NULL 的情况下,根本没有纸架可以存放东西。
-
@Lundin 持有者分别是
s1和s2:)
标签: c
char *s1 = \"\";
char *s2 = NULL;
我只想知道区别
s1 和 s2 :)
标签: c
一个是指向单个char 元素的数组的第一个元素,该元素是字符串空终止符'\0'。
另一个变量初始化指向NULL,这意味着它实际上并不指向任何地方。
稍微简化一下,定义
char *s1 = "";
相当于
char private_array[1] = { '\0' };
char *s1 = &private_array[0];
同时拥有一个字符串似乎令人困惑无效的终结者和泛型无效的指针,但它会随着更多的经验而自我清除。
另请注意,在 C 中,所有文字字符串(甚至 "")都不可修改,它们本质上是只读.这就是为什么建议始终使用const char * 来指向文字字符串的原因。
【讨论】:
使用"" 留下'\0' 有很大的不同,而NULL 留下指针为((void *)0)。
这可以通过取消引用指针来测试,例如:
注意:取消引用指针意味着访问其内部值或元素,这是使用 C/C++ 中的 * 一元运算符或 [] 运算符完成的。
#include <stdio.h>
int main(void){
char *s1 = "";
printf("%d", *s1);
return 0;
}
我正在打印*s1 的整数表示,因为在终端上看不到'\0'。
输出:
0
程序返回0,表示成功。
#include <stdio.h>
int main(void){
char *s2 = NULL;
printf("%d", *s2);
return 0;
}
上面的程序在stdout 上没有打印任何内容,但它返回了139,这意味着程序在退出之前就崩溃了(分段错误)。
你可以try it online。
【讨论】:
第一个指向 0 字节,可以取消引用,但第二个指向 0,不能取消引用
【讨论】:
字符 *s1 = ""; - 第一个指向一个0字节,第二个指向0 字符 *s2 = NULL; - 第一个可以取消引用,而不是第二个
【讨论】: