我正在为字符串编写一些函数,但我对 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->b
和 c.d
.
另一个错误是在创建函数中:
localString.string = content;
这会将字符指针content
分配给字符指针localString.string
,从而丢弃您刚刚分配的内存。你应该这样做:
strcpy(localString.string, content);
这会将字符串content
的内容复制到localString.string
的内存中。
我正在为字符串编写一些函数,但我遇到了 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->b
和c.d
.
另一个错误是在创建函数中:
localString.string = content;
这会将字符指针content
分配给字符指针localString.string
,从而丢弃您刚刚分配的内存。你应该这样做:
strcpy(localString.string, content);
这会将字符串content
的内容复制到localString.string
的内存中。