我收到以下代码:
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()的工作原理。 谢谢!
答案 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
。