C 通过动态分配内存更改字符指针中的字符

C 通过动态分配内存更改字符指针中的字符,c,string,C,String,在这里,我动态地将内存分配给p,以便可以更改字符串的特定字符,但这段代码挂起在中间 int main() { char *p; p=malloc(10*sizeof(char)); p="string"; p[0]='d'; printf("%s",p); } 我尝试将第5行的p=“string”替换为strcpy(p,“string”),代码运行良好。有人能告诉我这背后的原因吗 int main() { char *p; p=malloc(10*si

在这里,我动态地将内存分配给p,以便可以更改字符串的特定字符,但这段代码挂起在中间

 int main()
 {
  char *p;
  p=malloc(10*sizeof(char));
  p="string";
  p[0]='d';
  printf("%s",p);
 }
我尝试将第5行的
p=“string”
替换为
strcpy(p,“string”)
,代码运行良好。有人能告诉我这背后的原因吗

 int main()
 {
   char *p;
   p=malloc(10*sizeof(char));
   strcpy(p, "string");
   p[0]='d';
   printf("%s",p);
 }
线路

 p="string";
更改
p
以指向只读字符串文字,从而泄漏进程中先前分配的内存。您无法写入字符串文字,因此
p[0]='d'可能会导致seg故障

你的第二个版本,使用

strcpy(p, "string");
将只读字符串文本的内容复制到先前分配的内存中。您仍在使用在此处动态分配的缓冲区,因此可以在以后的代码中安全地更改其内容

另一个很小的问题是,
sizeof(char)
保证为1,因此您可以简化对的
malloc
调用

 p=malloc(10);
线路

 p="string";
更改
p
以指向只读字符串文字,从而泄漏进程中先前分配的内存。您无法写入字符串文字,因此
p[0]='d'可能会导致seg故障

你的第二个版本,使用

strcpy(p, "string");
将只读字符串文本的内容复制到先前分配的内存中。您仍在使用在此处动态分配的缓冲区,因此可以在以后的代码中安全地更改其内容

另一个很小的问题是,
sizeof(char)
保证为1,因此您可以简化对的
malloc
调用

 p=malloc(10);

指针可以拥有一个资源(malloc),也可以指向另一个实体已经拥有的资源。当您执行
p=“string”
,您正在创建一个
const char*
,将字符指针
p
分配给它,在前一行中泄漏malloc内存,在后一行中,您只是替换malloc内存中的内容;前者是错误/问题,后者不是。需要注意的是,尽管泄漏资源/内存是一种不好的做法,但这并不是挂起的原因

挂起的原因是,在引擎盖下的C代码中进行的编辑试图编辑程序的只读内存空间(
const char*
变量在该程序内存中创建为不可变字节数组)。进一步解释这一点

对于将所需字节传递给
malloc
,避免在表达式中使用type的一个好做法是:

const size_t count_required = 10;
char *p = malloc(sizeof(*p) * count_required);
// changing p's type to int* would also work without editing the malloc argument

当p的类型更改为,例如,
float
int
或任何其他类型时,表达式将继续正常工作,无需任何更改。

指针可以拥有一个资源(malloc),也可以指向另一个实体已经拥有的资源。当您执行
p=“string”
,您正在创建一个
const char*
,将字符指针
p
分配给它,在前一行中泄漏malloc内存,在后一行中,您只是替换malloc内存中的内容;前者是错误/问题,后者不是。需要注意的是,尽管泄漏资源/内存是一种不好的做法,但这并不是挂起的原因

挂起的原因是,在引擎盖下的C代码中进行的编辑试图编辑程序的只读内存空间(
const char*
变量在该程序内存中创建为不可变字节数组)。进一步解释这一点

对于将所需字节传递给
malloc
,避免在表达式中使用type的一个好做法是:

const size_t count_required = 10;
char *p = malloc(sizeof(*p) * count_required);
// changing p's type to int* would also work without editing the malloc argument

当p的类型更改为,例如,
float
int
或任何其他类型时,表达式将继续正常工作,不会发生任何更改。

首先,您的第一个程序中存在内存泄漏。您可以
malloc
,然后将指针指定给另一个常量字符串


其次,在第一个程序中,您正在修改一个常量字符串。但是第二个“正确”的程序,你要复制那个常量字符串,并将它复制到分配的内存中。您可以自由更改。

首先,您的第一个程序中存在内存泄漏。您可以
malloc
,然后将指针指定给另一个常量字符串


其次,在第一个程序中,您正在修改一个常量字符串。但是第二个“正确”的程序,你要复制那个常量字符串,并将它复制到分配的内存中。在C语言中,字符串不是值。不能使用赋值(
=
)复制字符串,但可以赋值指针(指针是“真实”值)

要将字符串复制到新分配的内存中,您需要:

strcpy(p, "string");

按照您编写它的方式,您正在使用静态字符串常量的地址覆盖由
malloc()
返回的指针。这导致了一场灾难;避免它们是使C语言成为一种值得使用的编程语言的挑战之一。

字符串在C中不是值。您不能使用赋值(
=
)复制字符串,但您可以赋值指针(指针是“真实”值)

要将字符串复制到新分配的内存中,您需要:

strcpy(p, "string");
按照您编写它的方式,您正在使用静态字符串常量的地址覆盖由
malloc()
返回的指针。这导致了一场灾难;避免它们是使C语言成为一种值得使用的编程语言的挑战之一。

charamessage[]=“现在是时候了”/*数组*/

char*pmessage=“现在是时候了”/*指针*/

amessage
是一个数组,刚好可以容纳字符序列,并且
'\0'
可以 初始化它。数组中的单个字符可以更改,但amessages将始终 另一方面,
pmessage
是一个指针,初始化为指向 字符串常数