将指针传递给函数并在函数结束时打印其值
Passing pointer to a function and print its value when the function ends
#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);
}
为什么第二个代码工作正常而第一个代码不行?
我怎样才能将代码写入 "force" 它像第一种方式一样工作?
您正在按值传递指针。
这是什么意思?
这意味着函数复制了原始函数指向的地址,然后您在函数内部分配内存,但是原始函数不知道这个新地址。
想象一下:
您的原始指针 (p1) 保存地址 0x2444
然后你将它按值传递给函数。该函数所做的是将 0x2444 复制到一个新指针 (p2),然后分配内存并将地址更改为 0x5555。
现在p2指向0x5555,但是p1仍然指向0x2444,所以无论你在p2上放什么都不会影响p1,p1仍然指向原来的位置0x2444.
这就是为什么它在函数完成后没有打印您期望的内容。
要按照您期望的方式工作,您可以通过引用传递指针
字符**
或者您可以 return 从函数到调用者的新指针。
这个简单的更改使您的代码有效:
#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指向同一个地址,分配后指向完全不同的地址
内存分配可能有点棘手,但希望这些示例能帮助您理解:)
第一个代码可以参考下面的例子。
#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 传递的
值,现在将通过引用传递
#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);
}
为什么第二个代码工作正常而第一个代码不行?
我怎样才能将代码写入 "force" 它像第一种方式一样工作?
您正在按值传递指针。 这是什么意思? 这意味着函数复制了原始函数指向的地址,然后您在函数内部分配内存,但是原始函数不知道这个新地址。
想象一下: 您的原始指针 (p1) 保存地址 0x2444 然后你将它按值传递给函数。该函数所做的是将 0x2444 复制到一个新指针 (p2),然后分配内存并将地址更改为 0x5555。 现在p2指向0x5555,但是p1仍然指向0x2444,所以无论你在p2上放什么都不会影响p1,p1仍然指向原来的位置0x2444.
这就是为什么它在函数完成后没有打印您期望的内容。
要按照您期望的方式工作,您可以通过引用传递指针 字符**
或者您可以 return 从函数到调用者的新指针。
这个简单的更改使您的代码有效:
#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指向同一个地址,分配后指向完全不同的地址
内存分配可能有点棘手,但希望这些示例能帮助您理解:)
第一个代码可以参考下面的例子。
#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 传递的 值,现在将通过引用传递