我正在向函数传递指针参数,调用中的指针值和被调用函数不同。为了给出一个想法,我正在编写一段与我的工作代码类似的代码 -
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正在为指针打印不同的值。
我在这里提供的代码可能不会发生这个问题,但我经常用我的工作代码点击它。有人能告诉我不同场景,其中作为堆栈参数传递的值被破坏了吗?
很抱歉打字错误,问题已得到纠正。
答案 0 :(得分:1)
我看到free_wrapper之前的printf和free_wrapper中的printf正在为指针打印不同的值。
您将a
传递给free_wrapper
,但在此之前您写的是c
,而不是a
!
那是因为他们不同。
答案 1 :(得分:1)
您的代码存在两个问题:
你正在释放一些不需要释放的东西。您正在将数组a
传递给free_wrapper函数。这是非法的。您只能释放您所谓的malloc
。所以要释放的是c
。
由于您正在将200字节缓冲区c
复制到100字节缓冲区{{}},因此您将大量覆盖缓冲区a
的末尾。 1}}。这会导致内存损坏。将c
设置为至少与c
一样大。
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只是复制字符串的内容,而不是将指针放在一起。