为什么使用malloc?
这个问题在这里已经有了答案:
char *strarray[5];
将分配五个指针数组(可以解释为字符串)。
这不会分配的是放置这五个字符串的内存空间。 所以,如果你想让所有的指针指向不同的字符串,你需要自己分配它们。
但是,由于这些是指针,如果你不想分配的话,你并不需要分配任何东西。 这就是为什么你的第一个例子正在工作。 strarray[0]="hello";
将使数组的第一个元素指向存储"hello"
字符串文字的位置(编译器会将此文字放在内存中的某处,以便您的指针指向有效的内存位置)。
总结一下,在第一个例子中,你的指针指向已经分配的内存,并用"hello"
初始化(编译器为你做了这个) - 你没有复制字符串,只是给指针赋值。 在第二个例子中,你的指针指向一个未定义的位置,而你没有明确保留,但是你正试图写入它。
这是错误的: char *strarray[5];
这是堆栈分配5个char *指针。 我想你想编写char strarray[6]
,它会在堆栈中创建6个字符。 这可以容纳“hello”和它的隐式NULL终结符(NULL终止符告诉C函数一个字符串已经结束)。
写了char strarray[6];
, strcpy(strarray, "hello");
是安全的。 然后你可以打电话给:
printf("%sn",strarray);
我已经删除了[0]: %s
期望char*
不是char
: strarray[0]
是一个char
类型。
您可以使用malloc
在堆上分配内存。 我可能会建议你阅读Kernighan和Ritchie(C编程语言)了解更多细节。
malloc()
:分配一个大小为字节的内存块,返回一个指向块开始的指针。
void* malloc (size_t size);
size_t
是一个unsigned int
类型。
如果你不知道要创建多少内存,这是必要的,这是不正确的。
你应该知道需要多少最小内存。
在malloc()的帮助下,您可以在run time
分配内存,而不是在compile time.
strarray[0]="hello";
//here you need not to allocate memory as this is an assignment
在使用指针作为strcpy()
destination string
之前,您需要分配一些空间
strcpy()
将source指向的C字符串复制到目标所指向的数组中,包括终止空字符(并在该点停止)。
目的地指向的数组的大小应足够长以包含与源(包括终止空字符)相同的C字符串,并且不应与内存中的源重叠。
为此,您需要先allocate Memory first
。
strcpy
本身不会为目标字符串分配内存