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

时间:2014-10-23 13:30:40

标签: c++ c pointers malloc

我收到以下代码:

char buffer[100];

int main()
{
   strcpy( buffer, "on the footsteps of dawn" );

     char *s = buffer;

   printf( "After assignment, s is:\n\t%s\n", s ); // prints out "on the footsteps of dawn"

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

   printf( "\nAfter modifying s, it is:\n\t%s\n", s );  
   printf( "But buffer is:\n\t%s\n", 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:\n\t%s\n", s );  // "on the footsteps of dawn...who's never ever been born" 
   printf( "But buffer is:\n\t%s\n", buffer ); // "on the footsteps of dawn"

所以我的问题是为什么在第二次尝试时,在修改s之后,缓冲区保持不变。我看到s分配了两种不同的方式,并且知道情况会是这样,但我想知道malloc()的工作原理。 谢谢!

4 个答案:

答案 0 :(得分:3)

考虑以下计划

#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 = %p\n", 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" );

指向在堆中显式分配的不同内存范围。声明

strcpy( s, buffer );

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

但是下一个声明

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

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

答案 1 :(得分:2)

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

有关malloc的详细信息,请查看here

答案 2 :(得分:2)

Kate,malloc()给你一个指向其他内存区域的新指针(与'buffer'无关)并将指针指向's'。现在'指向内存中的一个位置,而'缓冲'指向另一个位置。

strcpy()从内存块中取出名为'buffer'的字符,并将它们复制到现在称为's'的内存块中。 's'和'buffer'是内存中两个独立的点,恰好具有相同的字符。

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

在你的第一个案例中,''和'缓冲区'指向同一个内存,所以通过这两个变量可以看到用不同的'东西'填充内存。

+1,音乐品味极佳!

答案 3 :(得分:0)

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

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

无论如何都不会影响buffer