多次赋值后C指针丢失

标签 c pointers

我是 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 未初始化。您可能假设 qa(p,q) 之后发生更改,但由于该指针是按值传递的(与 C 中的所有内容一样),从 返回后a,对 q 所做的任何更改都将被丢弃(它们是 a 的本地更改)

为了解决这个问题,在保留大部分函数签名的同时,您必须添加另一层指针

在下面的代码中,a中的pq对于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/

相关文章:

pointers - 如何使用BLAS函数传递指向子数组的指针?

java - JNI 中 unsigned char 指针的等价物是什么?

c++ - 我正在阅读开源代码(C++),但不知道为什么他们这样放置枚举

c - 使用 getc 和 putc 打印文件内容

c - 如何在 mikroC 中打破循环

c - 在C中,如何对每个指针都指向可变长度int数组的指针数组进行排序?

c - 编译器是否应该对带有 void 指针的指针算法发出警告?

c - 为什么c的值不变?

c - 我无法理解教授关于 malloc 的代码

c - 获取函数指针以供其他函数使用