c - 如何在函数之间更改指针值
问题描述
我是 C 新手,对如何char *
在函数之间更改 a 的值感到困惑。
例如:
#include <stdio.h>
void testing(char *s) {
s = "hi";
} // testing
int main() {
char *s = "hello";
testing(s);
printf("%s\n", s);
} // main
在这种情况下,s 的值不会改变,"hello"
而是被打印出来。
如何更改s
,而不必更改任一函数的返回类型或参数?
解决方案
C 函数调用是严格按值传递的。这意味着当您传递s
到时testing
,会制作一个本地副本。因此,在函数中分配新值s
不会影响 中的值main
。
但是,由于指针的值被复制,您可以访问它指向的内存。如果s
指向非只读内存,您可以将一个缓冲区的内容复制到另一个缓冲区。例如,代替s = "hi";
,
strcpy(s, "hi");
在main
中,该语句char *s = "hello";
很可能s
指向一个只读缓冲区。要使其成为可写缓冲区,请s
改为声明为数组:
char s[] = "hello";
如果要更改指针的值,而不是它指向的值,则需要传入包含main
: 的版本的内存地址s
:指向指针的指针。看起来像这样:
#include <stdio.h>
void testing(char **s) {
*s = "hi";
} // testing
int main() {
char *s = "hello";
testing(&s);
printf("%s\n", s);
} // main
另一种(在这种情况下可能更好)方法是使用返回值而不是输入和输出的参数:
#include <stdio.h>
char *testing(char *s) {
s = "hi";
return s;
} // testing
int main() {
char *s = "hello";
s = testing(s);
printf("%s\n", s);
} // main
推荐阅读
- c# - 如何在 lambda 函数中按部分将存档流式传输到 S3?
- google-chrome-devtools - 预览版 chrome-devtools 中的 Base 64。怎么修?
- awk - awk 字符串大于变量
- c# - 如何在不进行任何压缩的情况下保存位图文件
- stm32 - STM32CubeMX 正在生成带有重复 C_SOURCES 的 Makefile
- algorithm - 为什么KMP算法中效率最低的失效函数的时间复杂度是O(n³)?- 编辑
- python - 如何将字符串标识为二进制运算符
- c# - 使用 Windsor Castle 容器时如何获取依赖所有者的类型?
- ios - NSData 类型的自定义类未命中 -bytes
- mysql - 通过与另一个表连接来删除并查找记录mysql表