2012-09-10 51 views
-2

我将一个指针参数传递给一个函数,调用函数和被调用函数中的指针值不同。为了让一个想法,我写了一段代码,看起来类似于我的工作代码 -C中的损坏堆栈变量

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 free_wrapper前的printf和printf的打印不同指针的值。

这个问题可能不会发生在我在这里介绍的代码,但我经常用我的工作代码打它。有人可以给我一些不同场景的想法,其中作为堆栈参数传递的值会被破坏吗?

对不起,错字已被更正。

+1

“当我损坏分配的内存”<---不要破坏它!问题解决了! –

回答

0

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

1

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

您传递afree_wrapper,但你写c,不a之前! 这是因为它们不同。

1

有两个问题与您的代码:

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

  2. 你被大量的改写你的缓冲区c结束,由于你正在复制一个200字节的缓冲区a为100字节的缓冲区c的事实。这会导致你的内存损坏。使c至少与a一样大。

char * strcpy (char * destination, const char * source);您的目标应该始终大于源缓冲区。还可以使用strcpy_s版本,它可以检查目标阵列的大小。

+0

解决了第一个问题,那是一个错字。我在两处打印了“c”的地址。我知道我正在覆盖边界,但我想明白为什么会损坏堆栈变量。 – satyaprakash

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只复制字符串的内容,而不是使指针相同。