为什么它是错的
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void func(char* dest, const char* src)
{
dest = malloc(strlen(src) + 1);
strcpy(dest, src);
}
int main()
{
char* name0;
char* name1 = "Jam";
func(name0, name1);
puts(name0);
free(name0);
return 0;
}
but
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct st
{
char* name;
};
void func(struct st* st1, const struct st* st2);
int main(void)
{
struct st name0, name1;
name1.name = "Jam";
func(&name0, &name1);
puts(name0.name);
free(name0.name);
name0.name = NULL;
exit(0);
}
void changename(struct st* st1, const struct st* st2)
{
st1->name = malloc(strlen(st2->name) + 1);
if(st1->name == NULL)
exit(1);
strcpy(st1->name, st2->name);
}
`是对的
3条答案
按热度按时间qnzebej01#
尝试通过引用而不是通过值将指针传递给字符指针。
mwecs4sa2#
撇开可能存在的其他错误不谈,这两者之间的最大区别是增加了一个间接层。
考虑以下结构
而现在这两个功能:
当调用
f1
时,修改本地副本a
对调用方传递的指针没有影响:对于传递给
f2
的指针也是如此。在f2
中修改f
对调用方传递的指针没有影响。但是,您可以在f2
中修改f
指向的内容,并且这对调用方是可见的。h79rfbju3#
在一种情况下,你有
func(name0, name1)
,在另一种情况下,你有func(&name0, &name1)
。函数不能更改传递给它的值。当您传递
name0
时,函数不能更改name0
。它只接收其值的副本。同样,当您传递&name0
时,函数不能更改&name0
的值。但是,该值指向一个对象。函数可以更改它指向的对象。当您传递
&name0
,且函式执行st1->name =…
时,它会变更st1
所指向之对象内的name
,也就是name0
。如果调用第一个函数的方式与调用第二个函数
func(&name0, &name1)
的方式相同,那么函数将被传递指向name0
和name1
的指针,而不是传递它们的值。然后,您需要更改func
以匹配:通过这些更改,函数将对其参数
dest
和src
所指向的内容进行操作,而不是对dest
和src
中的值进行操作。(It不需要更改调用和函数定义中的
src
参数,因为不需要更改源对象(我更改它只是为了匹配第二个函数)。