C语言 传递指向函数的指针,并在函数结束时打印其值


#include <stdio.h>
#include <stdlib.h>
void printPrueba(char * prueba){
    prueba = malloc(sizeof("dlkafñlasdjfñlasjdfñlasjdfñlasjdfñljasdlñfjaslñdfjsñladjfñlsadjf"));
    sprintf(prueba, "dlkafñlasdjfñlasjdfñlasjdfñlasjdfñljasdlñfjaslñdfjsñladjfñlsadjf");
}
int main(){
    char * prueba;
    printPrueba(prueba);
    printf(prueba);
    free(prueba);
}

.

#include <stdio.h>
#include <stdlib.h>
void printPrueba(char * prueba){
    prueba = malloc(sizeof("dlkafñlasdjfñlasjdfñlasjdfñlasjdfñljasdlñfjaslñdfjsñladjfñlsadjf"));
    sprintf(prueba, "dlkafñlasdjfñlasjdfñlasjdfñlasjdfñljasdlñfjaslñdfjsñladjfñlsadjf");
    printf(prueba);
}
int main(){
    char * prueba;
    printPrueba(prueba);
    free(prueba);
}

为什么第二个代码工作正常,而第一个代码不能?
如何编写代码以"强制"它像第一种方法一样工作?

您正在按值传递指针。什么意思?这意味着函数复制原始函数指向的地址,然后在函数内部分配内存,但原始函数不知道这个新地址。

想象一下以下内容:原始指针 (p1) 保存地址0x2444然后按值将其传递给函数。该函数的作用是将0x2444复制到新指针 (p2),然后分配内存并将地址更改为 0x5555。现在 p2 指向0x5555,但 p1 仍然指向0x2444,所以无论你放在 p2 上什么都不会影响 p1,p1 仍然指向原始位置0x2444。

这就是为什么它在函数完成后不会打印您期望的内容。

要按照预期的方式工作,您可以通过引用传递指针煳**

或者,可以将新指针从函数返回到调用方。

这个简单的更改使您的代码正常工作:

#include <stdio.h>
#include <stdlib.h>
void printPrueba(char ** prueba){
    *prueba = malloc(sizeof("dlkafñlasdjfñlasjdfñlasjdfñlasjdfñljasdlñfjaslñdfjsñladjfñlsadjf"));
    sprintf(*prueba, "dlkafñlasdjfñlasjdfñlasjdfñlasjdfñljasdlñfjaslñdfjsñladjfñlsadjf");
}
int main(){
    char * prueba;
    printPrueba(&prueba);
    printf(prueba);
    free(prueba);
}

要测试原始代码以查看两个指针如何指向不同的位置,您可以执行此更改:

#include <stdio.h>
#include <stdlib.h>
void printPrueba(char* prueba){
    printf("P2 BEFORE ALLOC: %pn", prueba);
    prueba = malloc(sizeof("dlkafñlasdjfñlasjdfñlasjdfñlasjdfñljasdlñfjaslñdfjsñladjfñlsadjf"));
    sprintf(prueba, "dlkafñlasdjfñlasjdfñlasjdfñlasjdfñljasdlñfjaslñdfjsñladjfñlsadjf");
    printf("P2 AFTER ALLOC: %pn", prueba);
}
int main(){
    char * prueba;
    printPrueba(prueba);
    printf("P1: %pn", prueba);
    printf(prueba);
    free(prueba);
}

您可以看到,分配之前的 P1 和 P2 都指向相同的地址,但在分配之后,它们指向完全不同的地址。

内存分配可能有点棘手,但希望这些示例可以帮助您理解:)

要使第一个代码正常工作,请参阅以下示例。

#include <stdio.h>
#include <stdlib.h>
void printPrueba(char **prueba){
    *prueba = malloc(sizeof("dlkafñlasdjfñlasjdfñlasjdfñlasjdfñljasdlñfjaslñdfjsñladjfñlsadjf"));
    sprintf(*prueba, "dlkafñlasdjfñlasjdfñlasjdfñlasjdfñljasdlñfjaslñdfjsñladjfñlsadjf");
}
int main(){
    char * prueba;
    printPrueba(&prueba);
    printf(prueba);
    free(prueba);
}

在这里,我将 char 指针的地址传递给函数。因此,如果在函数中我更改指针的值,它也应该在调用者函数中更改。

在您的情况下,函数的参数是使用 pass by 传递的值,现在将按引用传递

相关内容

  • 没有找到相关文章

最新更新