2014-10-01 99 views
0

我简单地做一个字符数组str.later我犯了一个char *p它简单地指向它,我可以访问(行程)从开始到结束str,我可以操纵使用pstr,意味着 p[i]='x';(其中,i:一有效索引,x:任何字符)是否有效?实际上我试过它是工作,我的问题是没有必要使用malloc给它记忆(即p = malloc(l * sizeof(char));)。可以使用char指针来操作它指向的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; 
} 
+1

是的,这是好的。 'char str [20];'分配20个字节,你用'p'指向那个分配。 – 2014-10-01 11:38:52

+0

我认为解释没问题*'* p'必须指向有效内存*。 – usr2564301 2014-10-01 11:38:55

+0

'p = str'表示'p'拥有'char'数组'str'的​​基地址。 – 2014-10-01 11:39:34

回答

1

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

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

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

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

+0

1'str'离开范围时,向哪个'p'点? – m23 2014-10-01 12:11:18

+0

现在p指向'NULL'? – m23 2014-10-01 12:18:37

+1

不,它继续指向相同的内存位置,现在可能会被别的东西使用,或垃圾。 – Max 2014-10-01 12:54:56

0

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

+0

赋值后'p = str;'它表示我的意思是什么,现在它们有相同的地址,但p现在是一个像str这样的数组,它有自己的内存空间,或者它与str共享它? – m23 2014-10-01 11:44:35

相关问题