将指针传递给函数并在函数结束时打印其值

时间:2015-03-11 08:58:29

标签: c function pointers printf malloc

#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);
}

为什么第二个代码工作正常而第一个不正常?
如何将代码写入&#34; force&#34;它的工作方式与第一种方式相同吗?

2 个答案:

答案 0 :(得分:0)

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

想象一下: 原始指针(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: %p\n", 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: %p\n", prueba);
}

int main(){
    char * prueba;
    printPrueba(prueba);

    printf("P1: %p\n", prueba);
    printf(prueba);

    free(prueba);
}

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

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

答案 1 :(得分:0)

对于第一个工作代码,请参考以下示例。

#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传递 值,现在将通过引用传递