C - 获取正确的字符*地址



我试图理解 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 ""
while ((*tmp++ = *second++)); // tmp value is end of char*
tmp-=(l_first+l_second + 1); // rewinding pointer to string start.
return tmp;
}

2.我必须手动"倒带"tmp才能在功能之外正确打印。

简而言之,我的问题是为什么我会有这种行为?我不太确定如何描述我的问题,我希望它足够清楚。为什么我必须在第二个函数中"倒带"指针,而不是第一个函数?此外,为什么我不必在第一个函数中"倒带">srcdest

我想到的可能解释:

  1. char* 是按值传递给函数的,这就是为什么我不必倒带srcdest- 被调试器证明是错误的(检查函数范围内的地址(。
  2. 在第一个函数中,我将一个在作用域外分配的指针作为dest传递,而在第二个函数中,tmp是在作用域内分配的。

谢谢 (我试图提供尽可能多的信息和尝试的解决方案,就像一个好的SO问题一样,如果它出现得太长,对不起(

为什么我必须在第二个函数中"倒带"指针,而不是 第一个?此外,为什么我不必在 第一个函数

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

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

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

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

如果出现char* my_strcat(char *first, char *second),您将返回指向串联字符串中最后一个字符的本地指针,因此您需要倒带。

如果您不想倒带指针,则只需使用一个指向tmp开头的虚拟指针并return虚拟指针,如下所示。

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 ""
while ((*tmp++ = *second++)); // tmp value is end of char*
return result;
}

如果你想改变目标指针,你需要传递对它的引用:

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 ""
while ((*tmp++ = *second++)); // tmp value is end of char*
*dest = result;
}
return result;
}

最新更新