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

时间:2016-01-14 10:30:30

标签: c string pointers constants literals

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

我知道如果我按照以下方式做某事:

(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);

3 个答案:

答案 0 :(得分:3)

你可以做到

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

现在,您可以使用char修改其中的str,因为它基本上是char数组。这意味着某些操作(例如递增str++)将无效。

但是,如果您严格要使用指针,则可以在上面的代码中添加另一行。

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

现在你可以使用ptr,像递增这样的操作都会起作用,因为它是一个指针。

答案 1 :(得分:3)

将空间分配给char *,当您在示例中讨论它时),而不是按字符进行,您可以使用strcpy -

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

答案 2 :(得分:2)

  

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

     

每当初始化一个char指针指向一个字符串文字时,   文字将存储在代码部分中。你无法修改   代码段内存。如果您正在尝试修改未经授权的内存   然后你会得到一个分段错误。

     

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