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

时间:2017-03-07 08:54:27

标签: 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)
{
        char *s1;

        xyz(&s1);

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

输出

s1 : abc

我的理解是我必须使用strdup()函数为C中的字符串分配内存,而我没有分配内存。但在这种情况下,只需使用&#34;分配字符串值,该程序似乎工作正常。 &#34;,有人可以解释一下吗?

3 个答案:

答案 0 :(得分:7)

字符串文字不存在于以太网中。它们驻留在程序存储器中并有一个地址。

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

出于这个原因,最好通过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
}

答案 1 :(得分:3)

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

*value = "abc";

对于这个语句,编译器首先在内存中创建一个字符数组,然后返回它的地址,然后将其存储在char指针中。值得知道编译器在只读内存中创建char数组。因此,返回的地址是指const char数组。任何尝试修改其值都将返回编译时错误。

答案 2 :(得分:1)

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