【问题标题】:What is/are the difference(s) between the two following variables? (Except their names)以下两个变量之间有什么区别? (除了他们的名字)
【发布时间】:2022-09-23 16:29:42
【问题描述】:

char *s1 = \"\";

char *s2 = NULL;

我只想知道区别

  • 这是一个类比:imgur.com/Af7I80M
  • @Raildex 有趣但不是很有教育意义。在 NULL 的情况下,根本没有纸架可以存放东西。
  • @Lundin 持有者分别是 s1s2 :)

标签: c


【解决方案1】:

一个是指向单个char 元素的数组的第一个元素,该元素是字符串空终止符'\0'

另一个变量初始化指向NULL,这意味着它实际上并不指向任何地方。


稍微简化一下,定义

char *s1 = "";

相当于

char private_array[1] = { '\0' };
char *s1 = &private_array[0];

同时拥有一个字符串似乎令人困惑无效的终结者和泛型无效的指针,但它会随着更多的经验而自我清除。

另请注意,在 C 中,所有文字字符串(甚至 "")都不可修改,它们本质上是只读.这就是为什么建议始终使用const char * 来指向文字字符串的原因。

【讨论】:

    【解决方案2】:

    使用"" 留下'\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

    【讨论】:

    • 取消引用空指针会导致未定义的行为,这可能导致崩溃。虽然不能保证,
    【解决方案3】:

    第一个指向 0 字节,可以取消引用,但第二个指向 0,不能取消引用

    【讨论】:

      【解决方案4】:

      字符 *s1 = ""; - 第一个指向一个0字节,第二个指向0 字符 *s2 = NULL; - 第一个可以取消引用,而不是第二个

      【讨论】:

        猜你喜欢
        • 2016-06-24
        • 2010-10-08
        • 1970-01-01
        • 1970-01-01
        • 2018-09-05
        • 1970-01-01
        • 2014-02-03
        • 1970-01-01
        • 2021-12-15
        相关资源
        最近更新 更多