C中的堆栈变量损坏

时间:2012-09-10 16:34:21

标签: c function parameters

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

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 个答案:

答案 0 :(得分:1)

  

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

您将a传递给free_wrapper,但在此之前您写的是c,而不是a! 那是因为他们不同。

答案 1 :(得分:1)

您的代码存在两个问题:

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

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

  3. a您的目的地应始终大于您的源缓冲区。还可以使用char * strcpy ( char * destination, const char * source );版本来检查目标数组的大小。

答案 2 :(得分:0)

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

答案 3 :(得分: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只是复制字符串的内容,而不是将指针放在一起。