以下程序运行正常,我很惊讶为什么:
#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;,有人可以解释一下吗?
答案 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是指向字符串中第一个字母位置的指针。