问一个关于字符串的简单问题?

来源:百度知道 编辑:UC知道 时间:2024/05/26 00:46:28
定义有:
char* p="123423sdffjfjfjfsdssfsfdsdssd";
char* t=(char*)malloc(sizeof(p));
strcpy(t,p);
意思相信大家已经明白了,就是我要准备把p指针的字符串拷贝给t,现在有一个问题是,t到底开辟多大的空间啊???此代码开辟的是4字节的空间,但是我实际操作发现,开辟1个字节的空间也行,char* t=(char*)malloc(1);而且不论你p的字串串有多长,开辟一个字节能够正常操作。如何理解这个问题????谢谢了!!!那么真正我们到底应该开辟多大的空间???????
还有请问下char* p="----------100个-----------";与char p[100],在内存分配上有什么不同么,如我认为char* p是连续的内存单元,可以作为一个整体,而char p[100]不能作为整体来使用,谢谢了,请讲解!!!!

我晕,这是个经典的缓存溢出实例啊。你已经很干脆的来了一次漂亮的缓存溢出啊。
开辟的空间的确是4字节没错,你也确实进行了一次完整的字符串复制操作。但事实并不像上面几位所说的,既没有只复制一个字节(实际上确实都复制了),也没有重新分配过空间。
上面的老兄之所以会有重新分配过空间的错觉是因为误解了strlen返回的结果吧。
这个需要了解的是strcpy和strlen的工作模式。
首先strcpy根本不管你分配了多少空间,他会一个一个的把字符从源地址复制到目标地址,直到遇到\0。strlen也不管究竟保存字符串的空间应该多大,他只管一个一个数,直到遇到\0为止。他们根本不知道自己在写的地址是不是已经正常分配了。
实际上上面的程序中的strcpy已经把字符复制到缓冲区外面了。
这两个函数很危险,经常一不小心就跑到不属于自己的空间去了。你觉得好像都正常,实际应该感谢分页机制。
你可以再试试把原来的字符串长度曾加到4k以上看看,那时候就看你运气如何了。

PS:四楼给的那个程序13行得那个strlen(t)恐怕结果不确定吧,分配后还没初始化过的内存里面的内容不一定会是什么,他只会找\0而已。

问题一:你把字符串赋值给指针P,实际上是把这个字符串的首地址赋给P的.并不是把整个字符串给P.而P本身所占空间就是四个字节.这是一般系统默认的.所以,你用sizeof计算P的空间大小时,结果只能是4字节.这就是你后面遇到的那样.
问题二:char p[100]定义后,系统要为这个数组分配一百字节的空间.而指针P只分配四个字节的空间.
不知我这样说你明白不.朋友.

strcpy()这个函数没有保证目的地的空间比原先的一定要大,也就是说你可以把一串长度为20的字符串A使用strcpy复制到一个长度只有1的字符串B中(实际上也只复制了字符串A的第一个字符).
建议使用strncpy这个函数进行字符串的复制.

#include <stdio.h>
#include <string.h>

main ()
{
char* p="