可以将字符串分配给char指针,而不使其成为文本吗?

可以将字符串分配给char指针,而不使其成为文本吗?,c,string,pointers,constants,literals,C,String,Pointers,Constants,Literals,这个问题听起来有点愚蠢,请允许我证明我的意思 我知道,如果我要做的事情是: (const) char *ptr = "I'm text!"; 这将是一个文字,我以后无法通过任何方式修改。然而,我想,既然有一种方法可以设置一个指针,使其像数组一样工作(在堆上),那么这样设置一个字符串不是也可以吗?如果是,简单的方法是什么 我尝试了以下方法,但与创建一个数组然后为其分配一个指针相比,这似乎是多余的 char *ptr = malloc(sizeof(char)*256); ptr[0]='S';

这个问题听起来有点愚蠢,请允许我证明我的意思

我知道,如果我要做的事情是:

(const) char *ptr = "I'm text!";
这将是一个文字,我以后无法通过任何方式修改。然而,我想,既然有一种方法可以设置一个指针,使其像数组一样工作(在堆上),那么这样设置一个字符串不是也可以吗?如果是,简单的方法是什么

我尝试了以下方法,但与创建一个数组然后为其分配一个指针相比,这似乎是多余的

char *ptr = malloc(sizeof(char)*256);

ptr[0]='S';
ptr[1]='u';
ptr[2]='p';
ptr[3]='e';
ptr[4]='r';
ptr[5]='\0';

printf("%s\n", ptr);  

free(ptr);
你能行

char str[] = "eureka, this works";
现在可以使用
str
修改其中的
char
s,因为它本质上是一个
char
数组。这意味着某些操作,如递增
str++
将不起作用


但是,如果您严格希望使用指针,则可以在上述代码中添加另一行

char str[] = "eureka, this works";
char* ptr = str;
现在,您可以使用ptr,像递增和all这样的操作将起作用,因为它是一个指针。

您可以这样做

char str[] = "eureka, this works";
现在可以使用
str
修改其中的
char
s,因为它本质上是一个
char
数组。这意味着某些操作,如递增
str++
将不起作用


但是,如果您严格希望使用指针,则可以在上述代码中添加另一行

char str[] = "eureka, this works";
char* ptr = str;

现在您可以使用
ptr
,因为它是一个指针,所以像递增和all这样的操作将起作用。

在为
char*
分配空间后(正如您在示例中所述),您可以使用
strcpy
-

char *ptr = malloc((sizeof *ptr)*256);
if(ptr!=NULL) {                     // check return 
     strcpy(ptr,"super");
     //do something 
} 
free(ptr); 

将空间分配给
char*
(正如您在示例中所述)后,可以使用
strcpy
-

char *ptr = malloc((sizeof *ptr)*256);
if(ptr!=NULL) {                     // check return 
     strcpy(ptr,"super");
     //do something 
} 
free(ptr); 
字符数组初始化和字符数组初始化之间存在差异 指针初始化

每当初始化字符指针指向字符串文字时, 文本将存储在代码段中。您不能修改 代码段内存。如果您试图修改未经授权的内存 然后您将得到一个分段错误

但是如果您初始化一个字符数组,那么它将存储在数据中 或堆栈部分,具体取决于声明数组的位置。那么你呢 然后可以修改数据

字符数组初始化和字符数组初始化之间存在差异 指针初始化

每当初始化字符指针指向字符串文字时, 文本将存储在代码段中。您不能修改 代码段内存。如果您试图修改未经授权的内存 然后您将得到一个分段错误

但是如果您初始化一个字符数组,那么它将存储在数据中 或堆栈部分,具体取决于声明数组的位置。那么你呢 然后可以修改数据



也许你想要这个:
charptr[]=“我是文本!”。这允许您修改由
ptr
指向的字符串。C没有字符串类型。这都是惯例。指针不是数组(反之亦然)。您的实际问题是什么?STFW代表
strdup
;大多数系统(包括POSIX)都有它
char*ptr=(char[]){“我是文本!”
@BLUEPIXY:字符串文字已经是
char[]
。不需要复合文字。也许您需要这样:
char ptr[]=“我是文本!”。这允许您修改由
ptr
指向的字符串。C没有字符串类型。这都是惯例。指针不是数组(反之亦然)。您的实际问题是什么?STFW代表
strdup
;大多数系统(包括POSIX)都有它
char*ptr=(char[]){“我是文本!”
@BLUEPIXY:字符串文字已经是
char[]
。不需要复合文字。@奥拉夫,我意识到他想以某种方式初始化,但仍然想修改它,就像指针一样。不过,我可以添加更多的信息来说明这一点。是的,我知道这一点,我只是想知道,如果我要“复制”一个数组作为堆上的指针,我如何才能以最舒适的方式“分配”字符串。无论如何,谢谢你的回答!数组不像指针。对于大多数用例,Itr只是衰减为1。但是有非常重要的区别。“就像一个指针”是一个有问题的陈述。尝试
str=“第二个文本”(我相信你知道,但如果不是OP,最终会有其他读者不知道)。@Olaf,我意识到他想以某种方式初始化,但仍然想修改它,就像指针一样。不过,我可以添加更多的信息来说明这一点。是的,我知道这一点,我只是想知道,如果我要“复制”一个数组作为堆上的指针,我如何才能以最舒适的方式“分配”字符串。无论如何,谢谢你的回答!数组不像指针。对于大多数用例,Itr只是衰减为1。但是有非常重要的区别。“就像一个指针”是一个有问题的陈述。尝试
str=“第二个文本”(我相信你知道,但如果不是OP,最终会有其他读者不知道)。谢谢你,这就是我想知道的。@Pumamori很高兴这有帮助。注意-只需检查
malloc
return
,就可以了。在我看来,它比OP要求的要复杂得多。静态分配可能就足够了。但谁知道呢,OP并不清楚他到底需要什么。@Olaf也许,但我在OP尝试动态分配的例子中回答说:)谢谢,这就是我想知道的一切。@Pumamori很高兴这有帮助。注意-只需检查
malloc
return
,就可以了。在我看来,它比OP要求的要复杂得多。静态分配可能就足够了。但谁知道呢,OP并不清楚他到底需要什么。@奥拉夫也许是这样,但我在OP尝试动态分配的例子中回答了这个问题:)