我得到了以下代码:
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。