分配指针和使用strcpy之间的区别



我得到了以下代码:

char buffer[100];
int main()
{
   strcpy( buffer, "on the footsteps of dawn" );
     char *s = buffer;
   printf( "After assignment, s is:nt%sn", s ); // prints out "on the footsteps of dawn"
   strcat( s, "... who's never ever been born" );
   printf( "nAfter modifying s, it is:nt%sn", s );  
   printf( "But buffer is:nt%sn", buffer );        //both print out "on the footsteps of dawn...who's never ever been born" 
   //now trying to do the same thing differently
   strcpy( buffer, "on the footsteps of dawn" );
   s = (char*) malloc( 100 );
   strcpy( s, buffer );
   strcat( s, "... who's never ever been born" );
   printf( "After modifying s, it is:nt%sn", s );  // "on the footsteps of dawn...who's never ever been born" 
   printf( "But buffer is:nt%sn", buffer ); // "on the footsteps of dawn"

所以我的问题是,为什么在第二次尝试时,在修改s后,缓冲区保持不变。我看到s是以两种不同的方式分配的,也知道情况会是这样,但我想知道malloc()到底是如何工作的。非常感谢。

考虑以下程序

#include <stdio.h>
#include <string.h>
char buffer[100];
int main( void )
{
    strcpy( buffer, "on the footsteps of dawn" );
    char *s = buffer;
    printf( "buffer = %p, s = %pn", buffer, s );
    return 0;
}

如果你运行它,你会得到printf输出相同的值两次。例如,在我的电脑里,我得到了

buffer = 0x80497e0, s = 0x80497e0

所以在这种情况下,s只是缓冲区的一个别名。它指向分配缓冲区的相同内存范围。

在您的程序的第二种情况下,当您编写时

s = (char*) malloc( 100 );
strcpy( s, buffer );
strcat( s, "... who's never ever been born" );

s指向堆中显式分配的不同内存范围。报表

strcpy( s, buffer );

复制了新区域中缓冲区的内容。

但是的下一个声明

strcat( s, "... who's never ever been born" );

不会影响缓冲区。它改变了不同的内存范围,因此缓冲区将与使用该语句之前相同。。

因为s不再指向buffer,它现在指向malloc返回的内存块的开头。

有关malloc的更多信息,您可以查看此处。

Kate,malloc()为您提供了一个指向其他内存区域的新指针(与"buffer"无关),并将该指针分配给"s"。现在,s指向内存中的一个点,而buffer指向另一个点。

strcpy()正在从名为"buffer"的内存块中获取字符,并将它们复制到现在名为"s"的内存中"s"one_answers"buffer"是内存中两个不同的点,恰好具有相同的字符。

strcat()添加到指向"s"的字符串上。"buffer"指向的字符串不会更改。记住,它们是两个不同的记忆区域,碰巧有相同的东西。

在第一种情况下,"s"one_answers"buffer"指向同一内存,因此通过这两个变量可以看到用不同的"stuff"填充内存。

+1表示对音乐的强烈品味!

malloc返回一个指向新分配内存的指针(如果成功)。然后将strcat复制到此新内存

s = (char*) malloc( 100 );
strcpy( s, buffer );
strcat( s, "... who's never ever been born" );

无论如何都不会影响CCD_ 7。

相关内容

  • 没有找到相关文章

最新更新