Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指定指针和使用strcpy之间的区别_C++_C_Pointers_Malloc - Fatal编程技术网

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()创建了一个与缓冲区无关的单独指针,但是在我读了更多关于这个主题的内容后,我非常怀疑这里的关键字是
别名
:)这里的关键字是
别名
:)