我正在为字符串编写一些函数,但我对 realloc 有疑问

I am writing some functions for Strings, but i have a problem with realloc

我正在为字符串编写一些函数,但我遇到了 realloc 问题。为什么我收到错误 realloc(): invalid pointer: 0x000...

这是我的字符串结构:

typedef struct {
    int length;       /* Length of the String excluding '[=10=]' */
    char * string;    /* pointer to string */
} string;

这是我的字符串创建函数:

string string_create(char content[]) {
    string localString;
    localString.length = 0;
    while (content[localString.length] != '[=11=]') {
        localString.length++;
    }
    localString.string = (char *)calloc((localString.length + 1), sizeof(char));
    localString.string = content;
    return localString;
}

这是我的字符串插入函数:(有问题的函数)

void string_insert(string * btstring, int index, char s[]) {        

    int stringLength = 0;
    while (s[stringLength] != '[=12=]') {
        stringLength++;
    }

    if (stringLength > 0) {
        btstring -> length += stringLength;
        btstring -> string = (char *) realloc((btstring -> string), ((btstring -> length + 1) * sizeof(char)));


        for (int i = 0; i < stringLength; i++) {
            char c = s[i];
            char temp[2] = {0, c};
            int cindex = index + i;
            while (btstring -> string[cindex] != '[=12=]') {
                temp[0] = btstring -> string[cindex];
                btstring -> string[cindex] = temp[1];
                temp[1] = temp[0];
                cindex++;
            }
            temp[0] = btstring -> string[cindex];
            btstring -> string[cindex] = temp[1];
            temp[1] = temp[0];
            cindex++;
            btstring -> string[cindex] = temp[1];
        }

    }

}

realloc 可以 return 请求的内存量在不同的地址(它可能会失败)。因此,你应该这样做:

    char *tmp;
    tmp = realloc(btstring->string, stringLength + 1);
    if (!tmp) return;                  // could not allocate the memory
    btstring->string = tmp;            // assign the (new) memory to the string.
    btstring->length = stringLength;   // only now update the length

备注:

  • realloc如果必须分配不同的内存来满足你的要求,保留原来内存的数据。

  • 不要转换 malloc 函数族的 return 值。 void 指针兼容所有指针。

  • 字符的大小始终为 1。

  • 虽然是风格问题,但结构和成员之间通常没有空格,如 a->bc.d.


另一个错误是在创建函数中:

localString.string = content;

这会将字符指针content分配给字符指针localString.string,从而丢弃您刚刚分配的内存。你应该这样做:

strcpy(localString.string, content);

这会将字符串content内容复制到localString.string的内存中。