分配指针和使用strcpy之间的区别
Difference between assigning a pointer and using strcpy
我得到了以下代码:
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"answers"buffer"是内存中两个不同的点,恰好具有相同的字符。
strcat()添加到指向"s"的字符串上。"buffer"指向的字符串不会更改。记住,它们是两个不同的记忆区域,碰巧有相同的东西。
在第一种情况下,"s"answers"buffer"指向同一内存,因此通过这两个变量可以看到用不同的"stuff"填充内存。
+1表示对音乐的强烈品味!
malloc
返回一个指向新分配内存的指针(如果成功)。然后将strcat
复制到此新内存
s = (char*) malloc( 100 );
strcpy( s, buffer );
strcat( s, "... who's never ever been born" );
无论如何都不会影响CCD_ 7。
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 这 4 个 lambda 表达式之间有什么区别?
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- (double) 和 double() 之间的区别
- & 和 * 之间的区别
- std::is_convertible 和 std::convertible_to 之间的区别(在实践中)?
- 析构函数和'delete'之间的区别
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- OpenMP #pragma omp for v/s #pragma omp parallel for 之间的区别?
- S() 与 S{} 之间的区别?