char指针能否用于操作它所指向的char数组?

char指针能否用于操作它所指向的char数组?,c,pointers,C,Pointers,我只是做了一个字符数组str。后来我做了一个char*p,它简单地指向它,我可以从str开始到结束访问(旅行),我可以使用p操纵str,意思是 p[i]='x'(其中i:有效索引,x:任何字符)有效??实际上,我试过了,它正在工作,我的问题是,是否不需要使用malloc(即p=malloc(l*sizeof(char));)给它提供内存 #包括 #包括 int main() { char-str[20]; char*p; scanf(“%s”,str); printf(“%s\n”,str);

我只是做了一个字符数组str。后来我做了一个
char*p
,它简单地指向它,我可以从
str
开始到结束访问(旅行),我可以使用
p
操纵
str
,意思是
p[i]='x'(其中i:有效索引,x:任何字符)有效??实际上,我试过了,它正在工作,我的问题是,是否不需要使用malloc(即p=malloc(l*sizeof(char));)给它提供内存

#包括
#包括
int main()
{
char-str[20];
char*p;
scanf(“%s”,str);
printf(“%s\n”,str);
int l=(int)strlen(str);
//printf(“l=%d\n”,l);
//p=str;
//p=malloc(l*sizeof(char));
p=str;
int i;

对于(i=0;i,因为您只替换p所指向的字节的内容,所以不需要为其分配新内存。

在这种情况下,就不需要为
p
分配内存。当您这样做时,在堆栈上为
str
分配内存:
char str[20]
。执行
p=str之后;
p
str
都指向堆栈上的相同内存地址。只要
str
在范围内,
str
p
都可以用来操作它们共享的内存地址处的值。
p[1]=“x”;
str[1]='x';
因此是等效的

但是要小心,如果在
str
离开作用域后保留
p
的值,并尝试使用它,则会出现未定义的行为。当
str
离开作用域时,内存将被释放,
p
将指向堆栈上可能被其他对象使用的地址。使用
p
可能无法获得内存您所需的内容以及对
p
的更改可能会干扰不相关的值

执行
p=malloc(l*sizeof(char));
在堆上分配新内存。由于它在堆上,您负责释放此内存,因此当处理退出分配它的作用域时,它仍将被分配


您可以在此处找到更多相关内容:

是,这很好。
char str[20];
分配20个字节,您正在使用
p
指向该分配。我认为解释没有问题
*p
必须指向有效内存。
p=str
表示
p
持有
char
数组
str
的基址。p=str表示我们p指向与str相同的地址。因此它只是指针,对吗?是的。它是指针。你现在怀疑什么?赋值后
p=str;
它表示什么,我的意思是,现在它们有相同的地址,但p现在是一个类似str的数组,它有自己的内存空间,或者它与str共享它??不,它继续指向相同的内存位置,现在可能被其他东西使用,或者贝奇。
#include<stdio.h>
#include<string.h>
int main()
{
  char str[20];
  char *p;
  scanf("%s",str);
  printf("%s\n",str);
  int l=(int)strlen(str);
  // printf("l= %d\n",l);
  //p=str;
  //p=malloc(l*sizeof(char));
  p=str;
  int i;
  for(i=0;i<l;++i)
    printf("%c-",*(p+i));
  printf("\nNow p=%s\n",p);
  p[1]='x';      // it is valid , but difficult to understand?? we didnot give it memory,but it can manipulate the str as well. 
  printf("After changes made\n",p);
  printf("p=%s\n",p);   
  printf("str=%s\n",str);
  return 0;
}