-2

我将指针参数传递给函数,调用和被调用函数中的指针值不同。为了给出一个想法,我正在编写一段看起来类似于我的工作代码的代码 -

void free_wrapper (char* a) {
printf ("a - %p \n", a);
free (a);
}

main () {
char a [200];
char * c = malloc (sizeof (char)*100); //some 100 bytes;

memset (a, 50, 200);
a [199]  = '\0';

/* here I write some data into the alloc'ed memory */
/* instead of writing 100 bytes I go and write beyond the boundaries */;

strcpy (c, a); //explicit use of strcpy
printf ("c - %p \n", c);
free_wrapper (c);

return 0;
}

当我破坏分配的内存时,我看到 free_wrapper 之前的 printf 和 free_wrapper 中的 printf 正在为指针打印不同的值。

我在这里展示的代码可能不会出现这个问题,但我经常用我的工作代码来解决这个问题。有人可以告诉我不同​​的场景,其中作为参数传递的值在堆栈上被破坏了吗?

抱歉打错了,问题已更正。

4

4 回答 4

1

您的代码有两个问题:

  1. 你正在释放一些不需要释放的东西。您正在将数组传递a给您的 free_wrapper 函数。这是非法的。你只能释放你所要求malloc的。所以要释放的是c.

  2. c由于您将 200 字节缓冲区复制a到 100 字节缓冲区中,因此您正在大量覆盖缓冲区的末尾c。这会导致您的内存损坏。c至少a与.

char * strcpy ( char * destination, const char * source );你的目的地应该总是比你的源缓冲区大。也使用strcpy_s版本,它检查你的目标数组的大小。

于 2012-09-10T16:46:25.187 回答
1

我看到 free_wrapper 之前的 printf 和 free_wrapper 中的 printf 正在为指针打印不同的值。

你传给afree_wrapper但之前你写c,不行a!那是因为它们不同。

于 2012-09-10T16:38:22.890 回答
0

我不确定您是否没有注意到您正在打印两个不同的值,这就是结果不同的原因:

printf ("c - %p \n", c); 
free_wrapper (a);    //This will call a printf of a
                     // a's memory location != c's memory location

或者如果您对 strcpy 的工作方式感到困惑。strcpy只是复制字符串的内容,而不是使指针成为同一个。

于 2012-09-10T16:47:20.997 回答
0

当然,它们打印不同的值;他们不同的价值观。a是分配在栈上的数组,c是从堆中动态分配的。(a是你传递给的free_wrapper)。

于 2012-09-10T16:36:51.407 回答