【问题标题】:Tricky C char pointer issue棘手的 C 字符指针问题
【发布时间】:2015-04-26 02:18:57
【问题描述】:

所以我正在尝试编写一个函数,该函数将接收两个指向字符的指针并返回一个指向它们连接的新指针。这是我的尝试:

#include <stdio.h>
#include <stdlib.h>

char * append (char *, char *);

int main(void) {

  char *start = "start";
  char *add = "add";
  char* newString = append(start, add);
  printf("%s\n", newString);
  return 0;
}

char * append(char *start, char *add) {
  char *newArray = malloc(sizeof(char) * 100);
  //get to end of start word
  while (*start != '\0') {
    *newArray = *start;
    newArray++;
    start++;
  }
  while (*add != '\0') {
     *newArray = *add; 
     newArray++;
     add++;
  }
  return newArray;
}

两个问题:

1) 到目前为止,它可以编译,但没有打印任何内容。我认为这是因为我的 append 函数返回一个指向连接字符末尾的指针。我应该创建一个临时字符指针并在一开始就将其设置为 newArray(这样我就可以返回它)吗?否则,我必须以某种方式减少我的指针,直到我回到开始。但是没有任何值(比如字符串结尾的 '\0')会告诉我我在 char 数组的开头...

2) 我读到我不能只使用 sizeof() 一个 char 指针,所以我不确定在 append 函数的第一行将什么作为参数传递给 malloc。 100 只是一个“足够大”的幻数,我想摆脱它......

如果我可以使用 sizeof() 一个字符指针,我会这样做:

char *newArray = malloc(sizeof(strlen(start) + strlen(add)) + 1);

感谢您的帮助,

布莱曼

【问题讨论】:

    标签: c pointers


    【解决方案1】:

    1) 是的,您需要保存一个指向已分配内存开头的指针,以便您可以返回它。最好将该指针视为“真实”指针,并将在存储字符时递增的指针视为临时指针,但这实际上并没有什么区别——指针就是指针

    2) 这就是strlen 的用途——它告诉你字符串的长度。所以你想要

    char *newArray = malloc(strlen(start) + strlen(add) + 1);
    

    根本不需要sizeof

    所有这些,你最终得到:

    char *append(char *start, char *add) {
      char *newArray = malloc(strlen(start) + strlen(add) + 1);
      if (!newArray) return 0; // out of memory
      char *copy = newArray;
      //get to end of start word
      while (*start != '\0')
        *copy++ = *start++;
      while (*add != '\0')
        *copy++ = *add++;
      *copy = 0; // add a final NUL terminator 
      return newArray;
    }
    

    【讨论】:

    • 大小更完整,你假设 op 的架构有 8 位字符类型。
    • @rhubarbdog:根据定义,sizeof(char) == 1 总是 - char 中的位数不会进入其中。从来没有任何理由在程序中使用sizeof(char)
    猜你喜欢
    • 1970-01-01
    • 2015-12-27
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多