获取正确的字符地址*

时间:2018-09-18 14:51:51

标签: c pointers

我试图了解C中char *操纵的行为。 这是我的驱动程序代码:

char *str1 = malloc(30);
char *str2 = "hello programmers.";
char *str4 = "and have a nice day.";
char *str5 = my_strcat(str2, str4);
my_strcpy(str1, str2);

和我的strcpy实现:

void my_strcpy(char *dest, char *src){
  while ((*dest++ = *src++)); //dest value is at end of char*
}

1。据我所知,当离开my_strcpy时, dest 应该指向字符串的结尾(因为我们一直在增加它的长度)。

现在让我们看看我的strcat:

char* my_strcat(char *first, char *second){
  int l_first = strlen(first), l_second = strlen(second);
  char *tmp = malloc (l_first + l_second + 1);

  while ((*tmp++ = *first++));
  tmp--; // overwrite tmp's "\0"
  while ((*tmp++ = *second++)); // tmp value is end of char*
  tmp-=(l_first+l_second + 1); // rewinding pointer to string start.
  return tmp;
}

2。我必须手动“倒带” tmp,以便在功能外正确打印。

简而言之,

我的问题是为什么会出现这种情况?我不确定如何描述我的问题,我希望它已经足够清楚了。为什么我必须在第二个函数中“倒带”指针,而不是在第一个函数中?此外,为什么我不必在第一个功能中“倒带” src dest

我想到的可能的解释:

  1. char *通过值传递给函数,这就是为什么我不必倒带 src dest 的原因-调试器证明是错误的(将地址检查进出)功能范围)。
  2. 在第一个函数中,我以 dest 的形式传递了在范围外分配的指针,而在第二个函数中, tmp 是在范围内的指针。 / li>

谢谢 (我试图提供尽可能多的信息,并且尝试的解决方案应该像一个很好的SO问题一样,对不起,如果回答太久了)

2 个答案:

答案 0 :(得分:2)

  

为什么我必须在第二个函数中“倒带”我的指针,而不必   首先?而且,为什么我不必在其中“倒带” src和dest   第一个功能

这是因为在C中,一切都是按值传递的。

  1. 传递值时,我们会将变量的副本传递给函数。

  2. 当我们通过引用传递时,我们会将变量的别名传递给函数。 它将指针的值(地址)复制到函数中。

因此,当您执行(*dest++ = *src++)时,不会增加实际变量,因此str2str4不会受到影响。

对于char* my_strcat(char *first, char *second),您将返回本地指针,该指针指向串联字符串中的最后一个字符,因此您需要后退。

如果您不希望倒转指针,则只需使用一个指向tmpreturn伪指针开头的伪指针,如下所示。

char* my_strcat(char *first, char *second){
  int l_first = strlen(first), l_second = strlen(second);
  char *tmp = malloc (l_first + l_second + 1);

  char *result = temp;

  while ((*tmp++ = *first++));
  tmp--; // overwrite tmp's "\0"
  while ((*tmp++ = *second++)); // tmp value is end of char*

  return result;
}

答案 1 :(得分:0)

如果要更改dest指针,则需要传递对其的引用:

char* my_strcat(const char **dest, const char *source){
  size_t l_first = strlen(first), l_second = strlen(second);
  char *tmp = malloc (l_first + l_second + 1);
  char *result = temp;
  const char *tmpdest = *dest;

  if(tmp)
  {
      while ((*tmp++ = *tmpdest++));
      tmp--; // overwrite tmp's "\0"
      while ((*tmp++ = *second++)); // tmp value is end of char*
      *dest = result;
  }
  return result;
}