追加字符串导致 "realloc(): Invalid pointer"

Appending strings results in "realloc(): Invalid pointer"

我有一个函数 append_string,它将 str2 附加到 str1:

void append_string(char* str1, char* str2) {
    int    new_length = strlen(str1)+strlen(str2);
    size_t new_size = sizeof(char)*(new_length);
    str1 = (char*) realloc(str1, new_size);
    strcat(str1, str2);
}

如函数所示,我正在尝试使用字符串的组合大小来增加大小。

每当我调用 append_str("", "adc"); 时,我都会得到 "realloc(): Invalid pointer"

我做错了什么?

至少这些问题:

正在尝试重新分配未分配的内容。

realloc(str1, new_size) 尝试重新分配 字符串文字 "" 导致“realloc():无效指针”。

尺寸缩小 1

新尺寸未考虑 空字符

// size_t new_size = sizeof(char)*(new_length);
size_t new_size = sizeof(char)*(new_length + 1);

代码丢失分配的指针

调用代码丢失了新指针的值str

调整大小的弱类型

使用size_t.


相反,传入分配的指针或NULL其地址。

void append_string(char** str, const char* appendage) {
  size_t new_length = strlen(*str) + strlen(appendage);
  size_t new_size = sizeof(char)*(new_length + 1);
  *str = realloc(*str, new_size);
  strcat(*str, appendage);
}

// Usage
char *s = malloc(1);
strcpy(s, "");
append_str(&s, "adc");
puts(s);

高级问题包括:

  • 如果realloc()returnsNULL怎么办?

  • 如何处理appendage重叠str?

  • 不要使用strcat()。避免 slow code。最好保留原始字符串长度并从那里复制。

      void append_string(char** str, const char* appendage) {
        size_t str_len = *str ? strlen(*str) : 0;
        size_t app_len = strlen(appendage);
        void *p = realloc(*str, str_len + app_len + 1);
        if (p == NULL) {    
          // Handle Error - various approaches
          free(*str);
          *str = NULL;
        } else {        
          strcpy(*str + str_len, appendage);
        }
      }
    

appendage*str 重叠时仍然需要处理大小写。

    void append_string_when_overlap_possible(char** str, const char* appendage) {
      size_t str_len = *str ? strlen(*str) : 0;
      size_t app_len = strlen(appendage);
      char *p = malloc(str_len + app_len + 1);
      if (p == NULL) {    
        // Handle Error - various approaches
        free(*str);
        *str = NULL;
      } else {        
        if (*str) {
          strcpy(p, *str);
        }
        strcpy(p + str_len, appendage);
        free(*str);
        *str = p;
      }
    }