#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void doSth(char *a)
{
char *b,*c;
b = malloc(2*sizeof(char));
b[0]='a';
b[1]='\0';
a = malloc(2*sizeof(char));
c = malloc(2*sizeof(char));
strcpy(a,b);
strcpy(c,b);
printf("c:%s\n",c);
free(c);
free(b);
}
int main()
{
char *myString;
doSth(myString);
printf("%s\n",myString);
free(myString);
return 0;
}
该程序仅输出&#34; c:a&#34;。 为什么我不能将b复制到?根据调试器,变量&#34; a&#34;每一行都是空的。
答案 0 :(得分:4)
通过在函数a = malloc(2*sizeof(char));
中执行void doSth(char *a)
,a
的本地副本在函数范围内被修改,但不在其中。如果您希望修改myString
,则应向该函数指定指向myString
(&myString
)的指针。它被称为传递指针:
char *myString;
doSth(&myString);
功能原型相应改变:
void doSth(char **a){
...
*a = malloc(2*sizeof(char));
strcpy(*a,b);
...
}
出于同样的原因,它是int a=1;printf("%d",a);
(printf
只需要a
的值),但是int a;scanf("%d",&a);
(scanf
需要一个指针{ {1}},修改主要内容中a
的值。