这个问题听起来有点愚蠢,请允许我证明我的意思。
我知道如果我按照以下方式做某事:
(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);
答案 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数组,那么它将存储在数据中 或堆栈部分,具体取决于您声明数组的位置。那么你 然后可以修改数据。