【问题标题】:Passing char* to a function in combination with memcpy结合 memcpy 将 char* 传递给函数
【发布时间】:2016-01-20 07:37:50
【问题描述】:

通常是一个基本问题,但也许我太愚蠢了。我尝试将char * 作为输出传递给函数的参数。在函数内部,我创建了一个临时的char *,我想将它memcpy 发送到我传递的地址。代码如下:

#define BLOCKSIZE=1024
int myFunction(char *s, char **out) {
  int i = strlen(s);
  *out = (char *)malloc(BLOCKSIZE);
  char tmp[BLOCKSIZE];

  strcpy(tmp, s);
  tmp[++i] = 0x0f;

  for(int i=strlen(s);i < BLOCKSIZE; i++) {
    tmp[i] = 0xcc;
  }

  memcpy(*out, tmp, BLOCKSIZE);

  return 0;
}

int main() {
  char *s = "Hello World";
  char *o = (char *)malloc(BLOCKSIZE);

  myFunction(s, &o);

}

问题是,堆栈在跳出函数myFunction..后损坏了。

还有其他方法吗?

提前谢谢你!

最好的,

更新:问题已解决 for循环部分i &lt; BLOCKSIZE必须改为i &lt; (BLOCKSIZE - 1)

【问题讨论】:

  • 你确定C++标签吗?这看起来像 C。在 C++ 中,这要容易得多。
  • 毫无意义。有了std::string,所有这些麻烦都根本不存在。或者它是一个标签错误,你正在做 C 编程?那么请编辑标签。
  • 您的代码示例是假的。 tmp[++i] = 0x0f; i 此时未声明。
  • 除了你的程序有一些已经被别人指出的严重缺陷之外,你如何确定堆栈已损坏?
  • 两次调用malloc 导致内存泄漏

标签: c char stack parameter-passing


【解决方案1】:

你的第一个问题是你malloc 两次,在函数之前和函数中。调用外的mallocmain的第二行)泄露了。

第二个问题(这告诉我你甚至没有编译代码)是你在定义它之前使用了i

【讨论】:

  • 是的,抱歉,忘记了 sn-p 中的 i 初始化。此外,如果删除第二个 malloc 它会失败 Run-Time Check Failure - Stack around the variable 'tmp' was corrupted
  • 这是因为您的实际代码中存在一些错误,此错误在此 sn-p 中不存在。我们不是通灵者。
  • 真的很抱歉,但这次是代码。没有什么比sn-p中的代码了。只是函数名称myFunction 不同。不过,我自己解决了我的问题。 for 循环必须从 i&lt;BLOCKSIZE 更改为 i&lt;(BLOCKSIZE-1)
  • @Brady:当前代码仍然无法编译,它在第一行就失败了。 BLOCKSIZE 有一个初始化器,但没有类型。循环长度完全可以。如果您认为您需要少一个字节,那是因为您将输出视为字符串(而不是字节块)。对于\0,字符串需要一个额外的字符。但是你不应该首先复制带有memcpy 的字符串。
  • @Brady。 (BLOCKSIZE-1) 为什么你认为这会有所作为? (提示:它不应该...)
猜你喜欢
  • 1970-01-01
  • 2023-03-29
  • 2019-12-11
  • 2012-07-26
  • 2023-03-06
  • 2012-05-10
  • 1970-01-01
  • 2019-09-19
相关资源
最近更新 更多