2011-03-11 80 views
0

如果我创建像在C中,我可以将字符串保存为char *,然后使用指针指向其他字符串?

char string[6] = "hello"; 
char* ptr = (char*) malloc(sizeof(string)); 
strcpy(ptr, string); 

一个字符串,然后我这样做:

char* ptr2 = ptr; 

将它的工作?

一般来说,如果我有一个char *指向字符串的指针,我可以让其他指针指向那个字符串,并且初始指针指向另一个字符串吗?

[编辑]

感谢您的反馈,但我有点困惑。我会尝试从头开始。

  1. 我有我的主要在我做了scanf函数读取一个字符串,它不是固定大小的,但有一个最大长度。我读到这样的char* input; scanf("%as", &input);。我认为'a'标志会自动分配所需的内存以适应字符串。

  2. 然后,我必须调用函数foo(char* s),它将字符串作为输入。

  3. 在函数内部,我必须将字符串存储在内存中。我有两个选择:使用参数或创建一个新的malloc和strcpy并使用新的字符串。哪两个是正确的?我只需要存储字符串的内存位置,稍后再引用它。

  4. 如果我使用参数并将它的存储位置存储在某处,这是安全的还是因为指向字符串的指针是常量会导致任何问题?用malloc创建另一个字符串是否可以解决任何问题,或者它是同一个问题?

直到现在,我已经尝试了几种组合,但我无法实现我想要的。任何帮助表示赞赏。

+0

只要你已经为所有的实际字符串(无论是通过malloc还是声明char数组)分配空间,你的建议应该适用于你的指针。 – GreenMatt 2011-03-11 16:47:41

回答

5
char[6] string = "hello"; 

根本不起作用。你的意思是char string[] = "hello";

是的,你可以互相指向别名,即指向相同的缓冲区。不过要注意的是,两者都不是free,或者在其中一个指针已经被free'd使用之后使用任何别名指针。

这实际上是非常有用的。考虑strcpy典型的实现,它必须回到它的第一个参数:

char *strcpy(char *dest, char const *src) 
{ 
    char *p = dest; // aliasing pointers 
    while (*src != '\0') 
     *p++ = *src++; 
    return dest; 
} 

是的,char *p2 = p1后,你可以在另一个缓冲区点p1,但是这主要是有用的棘手指针算法。再次,请注意内存分配。

+0

该问题已被编辑为有效的C,但针对指针别名+1。 – nmichaels 2011-03-11 16:52:41

+0

@nmichaels:考虑到围绕(strict /'restrict')混叠规则的细微之处,我认为这将是一个合适的术语。 – 2011-03-11 16:54:30

+0

您确定我可以稍后将p1指向另一个缓冲区吗?是不是p1应该是一个常量指针? – user579674 2011-03-13 12:26:51