[英]C pointer lost after multiple assignments
我是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)
之后发生a(p,q)
变化,但是由于该指针是按值传递的(就像C中的所有内容一样),从a
返回后,对q
所做的任何更改都将被丢弃(它们对a
是局部a
)
为了解决这个问题,在保留大多数函数签名的同时,您必须添加另一级指针
在下面的代码中, p
和q
对于a
是局部a
,但是您并没有直接更改它们,而是在修改由q
指向的值(该值是*char
类型,所以是另一个ponter,容易迷路)
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");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.