C中的字符串指针可以直接分配字符串文字吗?

C中的字符串指针可以直接分配字符串文字吗?,c,string,c-strings,C,String,C Strings,以下程序运行良好,我很惊讶为什么: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> void xyz(char **value) { // *value = strdup("abc"); *value = "abc"; // <-- ?????????? } int main(void) {

以下程序运行良好,我很惊讶为什么:

#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);
}

我的理解是,我必须使用
strdup()
函数为C语言中尚未分配内存的字符串分配内存。但在这种情况下,通过使用“”分配字符串值,程序似乎运行良好。有人能解释一下吗?

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

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

出于这个原因,最好通过常量正确来让编译器为您工作。尽可能将指针对象类型标记为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
}
#包括
#包括
#包括
#包括
无效xyz(字符常量**值)
{
*value=“abc”;
}
内部主(空)
{
字符常量*s1;
xyz(&s1);
printf(“s1:%s\n”,s1);

s1[0]=“a”;您可以使用
char*str=“some string”
在C中定义字符串,str是指向字符串中第一个字母位置的指针。

您的程序运行正常,因为字符串文字
“abc”
是字符数组,在为指针指定字符串文字时,编译器首先创建一个字符数组,然后返回数组第一个元素的地址,就像调用任何其他数组的名称一样。 因此,在您的程序中,您已将字符指针的地址传递给函数
xyz


对于该语句,编译器首先在内存中创建一个字符数组,然后返回其地址,该地址又存储在char指针中。值得一提的是,编译器在只读内存中创建了char数组。因此,返回的地址引用了常量char数组。任何修改其值的尝试都将返回COMPLE ti我的错误。

您的代码没有问题,在您的情况下,“abc”是一个字符串文字(放在只读段上),因此您不需要为它分配空间(但不允许修改此数据段,即
s1[0]='x';
)谢谢。我现在可以理解“abc”在编译时存储在内存中,并且将有一个固定地址,无论函数xyz()调用多少次,“abc”的内存都不会被分配多次。
#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
}
*value = "abc";