多次分配后C指针丢失

时间:2018-04-04 04:08:55

标签: 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()函数中没有打印任何内容。 printfa()函数中的b()次调用正在运行。我不知道为什么我的指针“q”在主函数中丢失了。我甚至尝试在main()函数中将动态内存分配给“q”,但仍然没有结果。

1 个答案:

答案 0 :(得分:4)

.contact中的

.third .message_wrapper { position: relative; } .third .message_wrapper .contact { position: absolute; bottom: 0; } .third .message_wrapper.sender .contact { right: 0; } .third .message_wrapper.sender .content_wrapper { margin-right: 12%; } .third .message_wrapper.receiver .contact { left: 0; } .third .message_wrapper.receiver .content_wrapper { margin-left: 12%; } 未初始化。您可能认为在q之后main()已更改,但由于该指针按值传递(作为C中的所有内容),从q返回后,对{{1}进行了任何更改被丢弃(它们是a(p,q)

的本地

要解决这个问题,在保留大部分功能签名的同时,你必须添加另一个指针级别

在以下代码中,a中的qap的本地代码,但您并未直接更改其中的任何内容,但是,您正在修改价值,由q指出(该值的类型为a,因此另一个很容易丢失)

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); .... } 中所做的那样)

为了更好地理解为什么会这样,请考虑这个更简单的例子:

q