C中的指针初始化

Bru*_*uce 21 c

在C中为什么这样做是合法的

char * str = "Hello";
Run Code Online (Sandbox Code Playgroud)

但非法做

int * arr = {0,1,2,3};
Run Code Online (Sandbox Code Playgroud)

cni*_*tar 12

我猜这就是初始化程序在C中的工作方式.但是,你可以这样做:

int *v = (int[]){1, 2, 3}; /* C99. */
Run Code Online (Sandbox Code Playgroud)

  • 您可以对字符串执行相同的语法,以获得可修改的字符串"literal". (2认同)

Mat*_*lia 8

至于C89:

"A string",在char数组初始化之外使用时,是一个字符串文字 ; 标准说,当你使用字符串文字时,就好像你创建了一个char初始化为该值的全局数组并写了它的名字而不是文字(还有一个额外的限制,任何修改字符串文字的尝试都会导致未定义的行为).在您的代码中,您正在char *使用字符串文字初始化a ,它会衰减到char指针并且一切正常.

但是,如果你使用一个字符串文字初始化一个char数组,几个魔法规则就会起作用,所以它不再"像一个数组......等"(这在数组初始化时不起作用),但它只是一个不错的告诉编译器应该如何初始化数组的方法.

{1, 2, 3}初始化数组的方法只保留了这个语义:它只用于数组的初始化,它不是"数组文字".


Dmi*_*tri 5

如果是:

char * str = "Hello";
Run Code Online (Sandbox Code Playgroud)

"Hello"是一个字符串文字.它在程序运行时被加载到内存中(但通常是只读的),并且具有可以分配给指针的内存地址char *str.但是,像这样的字符串文字是个例外.

附:

int * arr = {0,1,2,3};
Run Code Online (Sandbox Code Playgroud)

..你有效地试图指向一个没有放在任何地方特别是在内存中的数组. arr是一个指针,而不是一个数组; 它拥有一个内存地址,但本身并没有存储数组数据.如果您使用int arr[]而不是int *arr,那么它可以工作,因为像这样的数组与其内容的存储相关联.虽然数组在许多上下文中衰减到指向其数据的指针,但它并不是一回事.

即使使用字符串文字,char *str = "Hello";也可以char str[] = "Hello";做不同的事情.第一个设置指针str指向字符串文字,第二个指针初始化数组str来自"Hello".该数组具有与其关联的数据的存储空间,但指针只指向恰好已经在某处加载到内存中的数据.