我是 C 编程新手,对以下代码中的指针有一些问题。我使用的是C89标准。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char * b(char *p) {
char *z;
z = p;
printf("b(): %s\n", z);
return z;
}
void a(char *p, char *q) {
q = b(p);
printf("a(): %s\n", q);
}
void main(void) {
char *p = (char *) malloc(15);
char *q;
strcpy(p, "This is a test");
a(p,q);
printf("main(): %s\n", q);
free(p);
}
由于某种原因,我的 printf
函数在 main()
函数中没有打印任何内容。函数 a()
和 b()
中的 printf
调用均正常工作。我不确定为什么我的指针“q”在主函数中丢失了。我什至尝试在 main() 函数中将动态内存分配给“q”,但仍然没有结果。
最佳答案
main()
中的
q
未初始化。您可能假设 q
在 a(p,q)
之后发生更改,但由于该指针是按值传递的(与 C 中的所有内容一样),从 返回后a
,对 q
所做的任何更改都将被丢弃(它们是 a
的本地更改)
为了解决这个问题,在保留大部分函数签名的同时,您必须添加另一层指针
在下面的代码中,a
中的p
和q
对于a
来说是本地的,但你并不直接更改其中任何一个,即,您正在修改 q
指向的值(该值的类型为 *char
,因此另一个问题,很容易迷失)
void a(char *p, char **q) {
*q = b(p);
printf("a(): %s\n", q);
}
void main(void) {
...
a(p,&q);
printf("main(): %s\n", *q);
....
}
或者简单地返回该指针,并分配给 main
中的 q
(正如您在 b
中所做的那样)
为了更好地理解为什么会发生这种情况,请考虑这个更简单的示例:
void foo(int a) {
print("value is %d\n", a);
a = 42; // modifies only a local copy of passed parameter a
print("modified value is %d\n", a);
}
int main() {
int a = 0
printf("initial value is %d\n", a);
foo(a);
printf("value after returning is (still) %d\n, a");
}
关于多次赋值后C指针丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49642612/