我只是创建一个char数组str.later我做了char *p
只是指向它,我可以从开始到结束访问(旅行)str
,我可以操纵{{1}使用str
,意味着
p
(其中i:有效索引,x:任何字符)有效吗?实际上我试过它它正在工作,我的问题是没有必要使用malloc给它内存(即p = malloc(l * sizeof(char));)。
p[i]='x';
答案 0 :(得分:1)
在这种情况下,不需要为p
分配内存。当你执行str
时,内存在char str[20];
的堆栈上分配。完成p=str;
后,p
和str
都指向堆栈上的相同内存地址。只要str
在范围内,str
和p
都可以用来操作它们共享的内存地址的值。因此p[1]='x';
和str[1]='x';
是等效的。
但是要小心,如果在p
范围之后保持str
的值,并尝试使用它,则会出现未定义的行为。当str
离开作用域时,将释放内存,p
将指向堆栈上可能被其他内容使用的地址。使用p
可能无法获得您想要的内容,对p
进行更改可能会干扰不相关的值。
执行p=malloc(l*sizeof(char));
在堆上分配新内存。由于它在堆上负责释放此内存,因此在处理退出分配范围时仍会分配它。
您可以在此处找到更多相关内容:What is the difference between char s[] and char *s in C?
答案 1 :(得分:0)
因为你只是替换p指向的字节的内容,所以你不需要为它分配新的内存。