代码之家  ›  专栏  ›  技术社区  ›  ynn

字符串文字和指针之间有什么区别?

c
  •  0
  • ynn  · 技术社区  · 7 年前

    通常,可以使用任何字符串文本初始化指针,如 char *str = "Hello" . 我想这意味着 "Hello" 返回的地址 'H' . 但是,以下内容是不允许的。

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct {
        char name[64];
    } Student;
    
    Student initialization(char *str) {
        //Student tmp = {}; strcpy(tmp.name, str) //(*1)This is allowed.
        //Student tmp = {"Hello"}; //(*2)This is allowed.
        Student tmp = {str}; //(*3)This is not allowed.
        return tmp;
    }
    
    int main(void) {
        (...)
    }
    

    谁能告诉我为什么(*2)是允许的,但(*3)是不允许的?编译此代码会产生以下错误。

    warning: initialization makes integer from pointer without a cast [-Wint-conversion]
         Student tmp = {str};
                        ^
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   user2736738    7 年前

    所有这些情况下,您都试图初始化 char 大堆说到这里,我们可以看出这让事情变得更容易了。就像一个 烧焦 数组中,如果我们直接写下字符串文字,它将初始化 烧焦 包含字符串文字内容的数组。

    但在第二种情况下,字符串文字基本上是 烧焦 数组被转换为指向其第一个元素(字符串文字的第一个字符)的指针,然后该指针用于初始化 烧焦 大堆这行不通。请注意,即使 str 是指向 烧焦 不是文本的数组这将不起作用。与规定的原因相同。标准允许直接从字符串文本进行初始化。而不是相反。

    来自标准 6.7.9p14

    字符类型的数组可以由字符串文字或UTF-8字符串文字初始化,也可以用大括号括起来。字符串文本的连续字节(如果有空间或数组大小未知,则包括终止的空字符)初始化数组的元素。