为什么此函数(char *)不能通过ref传递?

时间:2019-10-27 03:59:22

标签: c

这是我的代码:

#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”。到底是怎么回事?

4 个答案:

答案 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中预期有相同的事物,那么应该传递的是地址 而不是地址的含义(如上述示例)。