我只是在学习C并达到了指针的目的。我写了一个方法,该方法应该连接两个char指针,但出现了一个奇怪的行为,我无法向自己解释,也没有找到答案,所以也许您可以帮忙!

所以我不明白为什么stringcatstringptr指向不同的地址,即8字节appart。其次,我不明白为什么我不能在底部的两个while循环中使用stringcat。我只是没有得到任何输出。另外,如果我在最后一个stringptr[0]中使用printf,则不会有任何输出。

提前谢谢你的帮助!

编辑:此代码有效,我只是不明白为什么我不能在底部使用stringcat

Edit2:注意到某些*在复制粘贴时丢失了,所以我添加了它们!

char stringcat(const char str1, const char* str2){
  char *ptr1 = str1;
  char *ptr2 = str2;
  int count = 0;

  while(*ptr1 != '\0'){
    count++;
    ptr1++;
  }

  while(*ptr2 != '\0'){
    count++;
    ptr2++;
  }

  char *stringcat = malloc((count+1)*sizeof(char));
  char *stringptr = stringcat;

  printf("%d %d", &stringcat, &stringptr);

  ptr1 = str1;
  ptr2 = str2;

  while(*ptr1 != '\0' && (stringptr++ = ptr1++));
  printf("%c", stringcat[0]);
  while(*stringptr++ = *ptr2++);

  return stringcat;
}

最佳答案

1)

printf("%d %d", &stringcat, &stringptr);


打印不同的变量stringcat和stringptr的地址,它们分配到堆栈中,因此,大概是在编译x64位程序,因此它们相距8个字节。

这个

printf("%d %d", stringcat, stringptr);


是你想要的。

我只是对您的代码进行了最少的更改以使其起作用:

char* stringcat(const char* str1, const char* str2) {
    const char *ptr1 = str1;
    const char *ptr2 = str2;
    int count = 0;

    while (*ptr1 != '\0') {
        count++;
        ptr1++;
    }

    while (*ptr2 != '\0') {
        count++;
        ptr2++;
    }

    char *stringcat = (char *)malloc((count + 1) * sizeof(char));
    char *stringptr = stringcat;

    printf("%d %d", stringcat, stringptr);

    ptr1 = str1;
    ptr2 = str2;

    while (*ptr1 != '\0' && (*stringptr++ = *ptr1++));
    printf("%c", stringcat[0]);
    while (*ptr2 != '\0' && (*stringptr++ = *ptr2++));

    *stringptr++ = '\0';

    return stringcat;
}

10-08 11:07