追加字符串导致 "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;
}
}
我有一个函数 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;
}
}