【问题标题】:Can a char pointer be used for manipulating the char array to which it is pointing?可以使用 char 指针来操作它指向的 char 数组吗?
【发布时间】:2014-10-01 11:36:28
【问题描述】:

我只是创建了一个 char 数组 str。后来我创建了一个 char *p,它只是指向它,我可以从头到尾访问(旅行)str,我可以使用 p 操作 str , 方法 p[i]='x';(其中 i:有效索引,x:任何字符)有效??实际上我试过它正在工作,我的问题是是否不需要使用 malloc 给它内存(即 p=malloc(l*sizeof(char));)。

#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;
}

【问题讨论】:

  • 是的,这很好。 char str[20]; 分配 20 个字节,您使用 p 指向该分配。
  • 我认为解释没有问题*p 必须指向有效内存
  • p=str 表示p 持有char 数组str 的基地址。
  • p=str 表示我们 p 指向与 str 相同的地址。所以它只是指针,对吗??
  • 是的。是指针。你现在有什么疑问?

标签: c pointers


【解决方案1】:

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

但要小心,如果你在str 离开范围之后保留p 的值并尝试使用它,则会出现未定义的行为。当str 离开作用域并且p 将指向堆栈上可能被其他东西使用的地址时,内存将被释放。使用p 可能无法得到你想要的,对p 进行更改可能会干扰不相关的值。

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

您可以在这里找到更多相关内容:What is the difference between char s[] and char *s in C?

【讨论】:

  • 不,它继续指向同一个内存位置,现在可能被其他东西或垃圾使用。
【解决方案2】:

因为你只是替换了 p 指向的字节的内容,你不需要为它分配新的内存。

【讨论】:

  • 在分配p=str;之后,我的意思是,现在它们有相同的地址,但是p现在是一个像str这样的数组,它有自己的内存空间或者它与str共享它??
猜你喜欢
  • 2021-01-26
  • 2018-04-05
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
相关资源
最近更新 更多