C中的字符串指针可以直接赋值给字符串字面量吗?

Can a string pointer in C be directly assigned a string literal?

下面的程序工作正常,我很惊讶为什么:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

void xyz(char **value)
{
        // *value = strdup("abc");
        *value = "abc"; // <-- ??????????
}

int main(void)
{
        char *s1;

        xyz(&s1);

        printf("s1 : %s \n", s1);
}

输出:

s1 : abc

我的理解是,我必须使用 strdup() 函数为 C 中的一个字符串分配内存,而我还没有为其分配内存。但是在这种情况下,程序似乎可以通过使用“”分配字符串值来正常工作,任何人都可以解释一下吗?

以太中不存在字符串文字。它们驻留在您的程序内存中并有一个地址。

因此您可以将该地址分配给指针。您的程序的行为定义明确,不会发生任何不良情况,只要您不尝试通过指针修改 文字。

因此,最好通过 const 正确让编译器为您工作。尽可能将指针类型标记为 const,您的编译器将反对修改尝试。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

void xyz(char const **value)
{
        *value = "abc";
}

int main(void)
{
        char const *s1;

        xyz(&s1);

        printf("s1 : %s \n", s1);
        s1[0] = 'a'; << Error on this line
}

你可以用char *str = "some string";在C语言中定义一个字符串,str是一个指针,指向字符串中第一个字母的位置。

您的程序运行良好,因为字符串文字 "abc" 是字符数组,而将字符串文字分配给指针时实际发生的是,编译器首先创建一个字符数组,然后 return数组第一个元素的地址就像我们调用任何其他数组的名称一样。 所以在你的程序中,你已经将 char 指针的地址传递给函数 xyz

*value = "abc";

对于这个语句,编译器首先在内存中创建一个字符数组,然后 return 它的地址又存储在 char 中 pointer.It 编译器创建 char 是值得知道的只读数组 memory.Thus ,地址 returned 引用一个 const char array.Any 试图修改它的值将 return 它编译时错误。