C 通过动态分配内存更改字符指针中的字符
在这里,我动态地将内存分配给p,以便可以更改字符串的特定字符,但这段代码挂起在中间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
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
是一个指针,初始化为指向
字符串常数