【问题标题】:Appending strings results in "realloc(): Invalid pointer"附加字符串会导致“realloc(): Invalid pointer”
【发布时间】:2022-01-04 00:25:11
【问题描述】:

我有一个函数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"

我做错了什么?

【问题讨论】:

    标签: c memory-management


    【解决方案1】:

    至少有这些问题:

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

    realloc(str1, new_size) 尝试重新分配 字符串文字 "" 导致“realloc(): Invalid pointer”。

    尺寸缩小 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()返回NULL怎么办?

    • 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;
          }
        }
    

    【讨论】:

    • 哇!这是非常具有描述性和易于理解的!谢谢!虽然,我不明白您在“代码丢失分配的指针”部分中的意思。你能详细说明一下吗?
    • @TahminAhmed 在str1 = (char*) realloc(str1, new_size); 之后,str 用于下一行strcat(str1, str2);,然后就是这样。分配的数据的指针在函数结束后丢失 - 内存仍然分配,但用户代码中没有地方保存指针值。
    猜你喜欢
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 2014-07-04
    • 2015-04-03
    相关资源
    最近更新 更多