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

标签 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);
}

为什么第二个代码可以正常工作,而第一个代码却不能?
我怎样才能编写代码来“强制”它像第一种方式一样工作?

最佳答案

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

想象一下以下情况: 你的原始指针(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);
}

可以看到alloc之前的P1和P2都指向同一个地址,但是分配之后却指向了完全不同的地址。

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

关于c - 将指针传递给函数并在函数结束时打印其值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28982180/

相关文章:

python - 如何使用 'mother' 中继承的 'child class' 类的函数?

c++ - 指向const变量的指针具有不同的拷贝

c - 使用 NULL 或 0 初始化变量和指针之间有区别吗?

C 编程 : pointers/char array

c - 我怎样才能复制一个数组? (尺寸相同)

c - 堆栈无法成功将数字插入其中

javascript - 组合两个新的 jQuery 函数

c - 为交互模式编写C程序

c++ - 如何在 Cygwin 文件结构中正确放置非默认 C++ 包

python - 我的 mac 终端无法运行 python 函数