这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void set(char* str){
str = malloc(10);
strcpy(str, "dog");
printf("\nstr = %s", str);
}
int main(){
char* s;
set(s);
printf("\n%s", s);
return 0;
}
这是我要打印的内容:
str = dog
dog
这是实际打印出来的内容:
str = dog
(null)
这是为什么?我想我正在做的是传递一个未初始化的指针,然后将该指针分配给set()中的一块内存,然后将其写入“ dog”。到底是怎么回事?
答案 0 :(得分:1)
C是一种按值传递的语言。除了显式之外,无法通过引用传递某些内容。对于您的情况,这意味着需要一个指向指针的指针:
void set(char **str)
{
*str = malloc(10);
strcpy(*str, "dog");
printf("str = %s\n", *str);
}
并使用您要“填写”的指针的地址进行调用:
int main(void)
{
char *s;
set(&s);
printf("%s\n", s);
return 0;
}
答案 1 :(得分:1)
为什么此函数(char *)不能通过ref传递?
C没有通过引用。一切都是按值传递的-只是有些值也指向其他值。调用s
(未定义的行为)以提供其参数set(s)
的值时,将读取未初始化的变量str
,然后str = malloc(10)
将该值扔给为本地str
分配一个新值。
您可以将指针传递给指针:
void set(char** str){
*str = malloc(10);
strcpy(*str, "dog");
printf("\nstr = %s", *str);
}
int main(){
char* s;
set(&s);
printf("\n%s", s);
return 0;
}
或返回一个指针:
char* set(void) {
char* str = malloc(10);
strcpy(str, "dog");
printf("\nstr = %s", str);
return str;
}
int main(){
char* s = set();
printf("\n%s", s);
return 0;
}
答案 2 :(得分:1)
您正在将未分配的指针传递给set函数,在此创建了指针的副本,并在该副本上使用了malloc。 main中的原始指针永远不会更新为新的内存地址。 要实现您想要的目标,可以通过以下方式完成:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void set(char** str){
*str = malloc(10);
strcpy(*str, "dog");
printf("\nstr = %s", *str);
}
int main(){
char* s;
set(&s);
printf("\n%s", s);
return 0;
}
我使用了指向集中指针的指针,并将指针 s 的内存地址传递给它。
答案 3 :(得分:1)
C中没有传递引用。但是指针和间接提供了一种间接模仿的工具。
在您的情况下,从main()发送到set()的是变量's'中的地址。它 在执行malloc()语句之前将具有该值。之后,str将具有malloc()返回的任何地址。
如果在main中预期有相同的事物,那么应该传递的是地址 而不是地址的含义(如上述示例)。