2011-07-04 109 views
4
#include<string.h> 
#include<stdio.h> 

int main() 
{   
    char *p;   
    strcpy(p,"hello world"); 
} 

那么,它显示undefined behaviour还是它指向hello世界?我见过很多使用这种类型的sytax的程序员。我知道它比一个你不知道字符串大小的数组更好。但是,在编程中使用它会很好吗?任何人都可以解释它?字符串和指针

+0

当我尝试运行此操作时,出现段错误。它在运行时编译并失败。这我希望从一个未初始化的指针。 – ncmathsadist

回答

4

这是未定义的行为,因为p未初始化。我不认为你实际上看到很多人这么做...

strcopy需要足够长度的缓冲区以将第二个参数的内容复制到。你的例子是故意设计的,但在实际代码中,你需要知道source_string的大小才能分配缓冲区。

+0

动态分配如何工作? – cody

+0

嘿你知道如何给一个数组动态内存分配? – cody

+0

好的,如果需要,你可以动态分配缓冲区,但是这不会改变响应。你可以很好地在栈上分配一个'char [12]'来保存字符串''hello world'''。 –

0

p未初始化并将任何内容复制到它将产生Segmentation Fault和不可预知的结果,因为p指向的内存中的位置未由代码指定。

在将字符串复制到p之前,必须指定p指向的内存。

你应该使用char [Buffersize];
例如char [12];

+1

或'char [12]'=) –

2

你没有初始化p,这样的行为是明确的定义。如果将p初始化为指向一个有足够空间容纳字符串的区域,或者将p指定为(不是strcpy()"hello world"p(因此将其指向存储文字字符串的初始化程序存储器中的区域),或者使用strdup()它会起作用,而不是strcpy()

+0

感谢你的geeko向我介绍了新的strdup函数。 – cody

1

我见过很多使用这种语法的程序员 。

我对此表示怀疑。也许有一些这样的语法,但不包含这些语义,即不是没有'p'指向足够容纳字符串的内存区域,包括其尾部的空字节。

1

您发布的代码是完全错误的,可能会导致程序崩溃,而且很难想象您会经常看到类似的代码。

您更可能看到类似以下的代码。

int main() 
{ 
    char *p = (char*)malloc(20); 
    strcpy(p, "hello world"); 
    free(p); 
} 
+0

是你的权利乔纳森 – cody

1

您不必分配和复制来获取字符串。你可以让编译器为你做所有的工作:

char p[] = "Hello world!"; 

它甚至会计算出适当的数组大小!