C strcpy是否需要特定的缓冲区大小或仍然有效?

时间:2014-04-24 09:20:34

标签: c buffer arrays strcpy packets

我反编译了一个应用程序,我不知道真正的数组大小,所以我把它做得很大,但我想我是否需要在使用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的数据还是仅用于数据包?并且可能无论如何都会附加数据包。

这是我试过的一个例子。

http://ideone.com/w7DsCl

4 个答案:

答案 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()的使用非常安全。