- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在做一项作业。我有正确的工作代码,但是,我无法理解一行的作用。
函数的描述是:
该函数将 malloc 5 个字节的内存,使用 strcpy 在这 5 个字节(4 个字母加 '\0')中存储“bird”,并将字符串指针指向的值增加字符串的长度(计算得出)使用 strlen) 它指向的(因此它最终指向句子末尾的 '\0')。然后它将返回分配的内存。
这是执行上述操作的代码
char *get_word( char **string_ptr ){
char *word;
word = malloc( 5 );
strcpy( word, "bird" );
*string_ptr += strlen( *string_ptr );
return word;
}
我不明白“*string_ptr += strlen( *string_ptr );”这行是什么意思确实如此,即使有上面的描述。有人能给我更详细的解释那里发生的事情吗?
最佳答案
传递给get_word
的参数是 char **
(大概是由于调用者传递了字符串的地址而不是指针的集合)。
由于 C 中的所有参数都是按值传递的,因此为了更改作为参数传递的指针的地址,必须传递指针的地址。否则,该函数将仅接收指针的副本(具有其自己的且非常不同的地址),并且在函数内对指针所做的任何更改在调用函数中都将不可见。
虽然您没有提供 A Minimal, Complete, and Verifiable Example (MCVE) ,我们可以从您的函数中推断出字符串的地址正在传递给 get_word
,类似:
#define MAXC 1024
...
char buffer[MAXC] = "word_one";
char *p = buffer;
char *new_word = NULL;
...
new_word = get_word (&p);
然后,在该指针的末尾附加文本(这是 *string_ptr += strlen( *string_ptr );
中 get_word
的目的),如下所示:
strcpy (p, new_word);
结果是,缓冲区现在将包含:
"word_onebird"
实际上,通过将指针地址传递给 get_word
,指针前进到 string_ptr
中当前单词的末尾通过*string_ptr += strlen( *string_ptr );
并更改为 string_ptr
指向的内容会反射(reflect)在调用函数中。
如果你只通过了get_word(string_ptr)
,get_word
中所做的更改在调用函数中将不可见,并且那里的指针将保持不变。但是,通过传递地址string_ptr
与 get_word(&string_ptr)
, get_word
的变化(通过*string_ptr = ...
对原始指针本身进行操作反射(reflect)在调用函数中的原始指针中。
通过示例理解指针
指针只是一个普通变量,它保存其他内容的地址作为其值。换句话说,指针指向可以找到其他内容的地址。您通常会想到保存立即值的变量,例如 int a = 5;
,指针将简单地保存 5
所在的地址。存储在内存中,例如int *b = &a;
。无论指针指向什么类型的对象,它的工作方式都是相同的。 (指针,只是指针......)
如果需要更改函数内指针指向的地址而不返回新指针,则必须将原指针的地址作为参数传递,以便函数可以进行操作原始指针本身,而不是如果参数采用指针本身,则函数中将存在指针的副本。
举个例子可能会有所帮助。花一些时间来完成代码并了解原始指针如何在 get_word
中使用。 ,但 get_word_single
中仅提供原始副本。如下:
#include <stdio.h>
#include <string.h>
#define MAXC 256
/* parameter passes only the pointer p in main() */
void get_word_single (char *string_ptr)
{
printf ("in get_word_single()\n"
" address of string_ptr: %p <-- a new pointer\n"
" value in string_ptr: %p <-- changes only seen locally\n\n",
(void*)&string_ptr, (void*)string_ptr);
string_ptr += strlen (string_ptr);
}
/* parameter passes address of p in main() */
void get_word (char **string_ptr)
{
printf ("in get_word()\n"
"address of string_ptr: %p <-- a new pointer\n"
" value in string_ptr: %p <-- holding original address\n\n"
"address of *string_ptr: %p <-- dereference to expose address\n"
" value in *string_ptr: %p <-- modify to change original\n\n",
(void*)&string_ptr, (void*)string_ptr,
(void*)&(*string_ptr), (void*)*string_ptr);
*string_ptr += strlen (*string_ptr);
}
int main (void) {
char buf[MAXC] = "one", /* a 3-character word in buf */
*p = buf;
printf ("in main()\n"
"address of p: %p <-- address of the pointer itself\n"
" value in p: %p <-- address held by the pointer\n\n",
(void*)&p, (void*)p);
get_word_single (p);
printf ("in main()\n"
"address of p: %p <-- address of pointer itself unchanged\n"
" value in p: %p <-- no change in address held\n\n",
(void*)&p, (void*)p);
get_word (&p);
printf ("in main()\n"
"address of p: %p <-- address of pointer itself unchanged\n"
" value in p: %p <-- address held incremented by 3\n\n",
(void*)&p, (void*)p);
return 0;
}
示例使用/输出
$ ./bin/passaddrex
in main()
address of p: 0x7ffc8594f370 <-- address of the pointer itself
value in p: 0x7ffc8594f380 <-- address held by the pointer
in get_word_single()
address of string_ptr: 0x7ffc8594f378 <-- a new pointer
value in string_ptr: 0x7ffc8594f380 <-- changes only seen locally
in main()
address of p: 0x7ffc8594f370 <-- address of pointer itself unchanged
value in p: 0x7ffc8594f380 <-- no change in address held
in get_word()
address of string_ptr: 0x7ffc8594f348 <-- a new pointer
value in string_ptr: 0x7ffc8594f370 <-- holding original address
address of *string_ptr: 0x7ffc8594f370 <-- dereference to expose address
value in *string_ptr: 0x7ffc8594f380 <-- modify to change original
in main()
address of p: 0x7ffc8594f370 <-- address of pointer itself unchanged
value in p: 0x7ffc8594f383 <-- address held incremented by 3
关于c - C 中字符串指针的增加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50788388/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!