C++ 指定指针和使用strcpy之间的区别
我得到了以下代码:C++ 指定指针和使用strcpy之间的区别,c++,c,pointers,malloc,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
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()到底是如何工作的。
谢谢大家! 这是因为
s
不再指向buffer
,而是指向malloc
返回的内存块的开头
有关
malloc
的更多信息,您可以查看。这是因为s
不再指向buffer
,而是指向malloc
返回的内存块的开始
有关malloc
的详细信息,您可以查看。Kate,malloc()将为您提供一个指向其他内存区域(与“缓冲区”无关)的新指针,并将该指针指定给“s”。现在“s”点位于内存中的一个点,而“buffer”点位于另一个点
strcpy()从名为“buffer”的内存块中提取字符,并将它们复制到现在名为“s”的内存块中“s”和“buffer”是内存中两个单独的点,恰好具有相同的字符
strcat()将添加到指向“s”的字符串上。“buffer”指向的字符串不会更改。记住,它们是两个独立的记忆区域,碰巧有相同的东西
在第一种情况下,“s”和“buffer”指向同一个内存,因此通过这两个变量可以看到用不同的“东西”填充该内存
+1对于伟大的音乐品味 Kate,malloc()将为您提供一个指向其他内存区域(与“缓冲区”无关)的新指针,并将该指针指定给“s”。现在“s”点位于内存中的一个点,而“buffer”点位于另一个点
strcpy()从名为“buffer”的内存块中提取字符,并将它们复制到现在名为“s”的内存块中“s”和“buffer”是内存中两个单独的点,恰好具有相同的字符
strcat()将添加到指向“s”的字符串上。“buffer”指向的字符串不会更改。记住,它们是两个独立的记忆区域,碰巧有相同的东西
在第一种情况下,“s”和“buffer”指向同一个内存,因此通过这两个变量可以看到用不同的“东西”填充该内存
+1对于伟大的音乐品味 考虑以下程序
#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;
}
因此,在本例中,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" );
不影响缓冲区。它更改了不同的内存范围,因此缓冲区将与使用语句之前相同。考虑以下程序
#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;
}
因此,在本例中,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" );
不影响缓冲区。它会更改不同的内存范围,使缓冲区与使用语句之前相同。
malloc
返回指向新分配内存的指针(如果成功)。然后,您复制并strcat
到这个新内存中
s = (char*) malloc( 100 );
strcpy( s, buffer );
strcat( s, "... who's never ever been born" );
它无论如何都不会影响缓冲区。
malloc
返回指向新分配内存的指针(如果成功)。然后,您复制并strcat
到这个新内存中
s = (char*) malloc( 100 );
strcpy( s, buffer );
strcat( s, "... who's never ever been born" );
这不会影响缓冲区。您是否尝试过自己查找
malloc
的工作原理。。?它有很好的文档记录。您确定在malloc()中正确使用了size参数吗?i、 你确定100英镑就是你所需要的吗?听起来你在拥有100个字节后就错过了。为什么不打印出*s的大小,看看它在整个字符串中实际有多大?我不知道代码片段与malloc的工作方式有什么关系。您可以使用两个不同的静态缓冲区,但仍然可以得到相同的结果behaviour@hagubear:如果你想复制一个100字节的char
数组,那么让malloc()
为它分配100字节是非常好的。事实上,我读过关于malloc()的信息!但这让一切变得更加混乱。如果一开始我有一个答案,malloc()创建一个与缓冲区无关的单独指针,但在我读了更多关于这个主题的内容后,我非常怀疑您是否尝试查找自己的malloc
工作原理。。?它有很好的文档记录。您确定在malloc()中正确使用了size参数吗?i、 你确定100英镑就是你所需要的吗?听起来你在拥有100个字节后就错过了。为什么不打印出*s的大小,看看它在整个字符串中实际有多大?我不知道代码片段与malloc的工作方式有什么关系。您可以使用两个不同的静态缓冲区,但仍然可以得到相同的结果behaviour@hagubear:如果你想复制一个100字节的char
数组,那么让malloc()
为它分配100字节是非常好的。事实上,我读过关于malloc()的信息!但这让一切变得更加混乱。如果一开始我得到的答案是malloc()创建了一个与缓冲区无关的单独指针,但是在我读了更多关于这个主题的内容后,我非常怀疑这里的关键字是别名
:)这里的关键字是别名
:)