我反编译了一个应用程序,我不知道真正的数组大小,所以我把它做得很大,但我想我是否需要在使用strcpy
之前完全按照我所知道的那样做我也考虑strcpy
的大小?
signed int __cdecl SendSomePacket(struct CONNECTION* conn, int a1, int a2, const char *a3)
{
//char buf[256]; // [sp+10h] [bp-9h]@1
char buf[10]; // [sp+10h] [bp-9h]@1
*(unsigned int *)&buf[1] = a1;
*(unsigned int *)&buf[5] = a2;
strcpy(&buf[9], a3);
buf[0] = 0xEu; // Packet Type
return SendPacket(CONNECTION->socket, buf, strlen(a3) + 10, 1);
}
我问我应该留下它256这是它猜测的默认大小,它总是乘以2乘以256,512,1024,2048 ..
char buf[256]; // [sp+10h] [bp-9h]@1
或者我应该尽量减小以节省内存。
char buf[10]; // [sp+10h] [bp-9h]@1
我在strlen(a3)
之后想到那个数字是缓冲区应该有多大。
我尝试使用strcpy,缓冲区大小为10 ..然后我输入了一个长度超过500的字符串,它的工作可能很幸运。我只是想知道我应该让静态缓冲区足够大的初始数据包+来自strcpy的数据还是仅用于数据包?并且可能无论如何都会附加数据包。
这是我试过的一个例子。
答案 0 :(得分:3)
它将复制源字符串中的字符数。它不知道目标缓冲区有多大,如果你给它一个太长的源字符串,它将覆盖到随机区域。没有“默认大小”,绝对没有“猜测”。
小心,听起来好像你不清楚基础知识是如何在这里工作的。
如果您已知道来源的长度,最好使用memcpy()
。
答案 1 :(得分:1)
我认为使用malloc
使用动态内存分配会更好。
这样做:
char *buf = malloc(strlen(s3) + 1 + sizeof(a1) + sizeof(a2));
然后
sprintf(buf, "%u%u", a1, a2);
strcpy(buf + 8, a3); // Assuming sizeof(u_int) == 4
它将节省内存。
使用后请记得free
buf
。
答案 2 :(得分:1)
strcpy将写入与源字符串长度一样多的字节,因此它将超出您的缓冲区大小。所以最好使用更大的数组或使用动态内存分配。
答案 3 :(得分:1)
很多关于strcpy()是一个不安全函数的混淆批评来自于这样使用它。
在调用strcpy()之前,您需要知道要复制的数据的大小。如果你事先不知道这一点,你必须在调用strcpy()之前调用strlen()来查找。否则,您的程序容易受到缓冲区溢出的影响。
如果您确实知道尺寸,strcpy()的使用非常安全。