replace("random string");
我使用像realloc
这样的函数。
这里我试图增加字符串的大小,以便可以用另一个字符串替换空格。为此,我需要计算空格的数量,并获得原始字符串的长度。我能够做到这一点。
要调整大小我使用的是Aborted (core dumped)
,但是当我运行它时,它会提供{{1}}?
答案 0 :(得分:7)
您的原始字符串是否使用malloc分配?还是realloc?也许您正在尝试增加静态字符串的大小(字符串文字):
char sStatic[256]; // cannot realloc
char *sNonStatic = NULL; // can / must realloc
replace("random string") // cannot realloc within replace
编辑:阅读完评论后,您应该获取传入字符串的副本,增加大小,然后输出一个副本/新字符串。您不能增加常量字符串的大小(字符串文字)。
答案 1 :(得分:5)
唯一可以传递给realloc
的指针是空指针以及之前由calloc
,malloc
或realloc
返回的指针!强>
这很重要,因为你提到你调用了像replace("random string")
这样的函数... "random string"
是空指针,还是由其中一个*alloc
函数返回?不。也许您打算使用strdup
或其他内容(例如char *foo = strdup("random string"); replace(foo); free(foo);
)? strdup
是POSIX函数(例如,不像*alloc
函数那样的C标准),但应该返回*alloc
函数返回的内容。
遵循以下代码:
unsigned int new_len = len + 2 * no_of_spaces;
str = (char*) realloc(str, new_len * sizeof(char)); /* NOTE there's a potential memory leak
* when realloc returns NULL here, though
* that's the least of your problems */
...您必须检查str
以确保realloc
成功,并且只有str
的唯一有效索引介于0和new_len - 1
。这是空指针取消引用或缓冲区溢出:
str[new_len] = '\0';
也许你的意思如下:
size_t new_len = len + 2 * no_of_spaces;
void *temp = realloc(str, new_len + 1); /* <--- NOTE +1 HERE! */
if (temp == NULL) {
/* XXX: Bomb out due to allocation failure */
}
str = temp;
...现在有效索引介于0和new_len + 1 - 1
之间,所以这是有效的:
str[new_len] = '\0';
答案 2 :(得分:1)
此行不正确,因为有效索引的范围为0
.. new_len - 1
:
str[new_len] = '\0';
应该是:
str[new_len - 1] = '\0';
您还有其他一些潜在问题:
realloc可以返回NULL - 你应该检查这个
如果realloc失败,你会失去原来的str
指针并导致内存泄漏 - 你应该使用一个临时指针来测试结果,测试这个为NULL,然后只有当realloc成功时你应该将str设置为等于temp:
char * temp = realloc(str, new_len);
if (temp == NULL)
{
// handle error here...
}
else
{
str = temp; // success...
str[new_len - 1] = '\0';
}
答案 3 :(得分:0)
您还可以移动指针
while (*str) {
if ((char)*str == SPACE)
no_of_spaces++;
str++;
len++;
}
当你到最后,你试图重新分配它。但是你已经远离了数组所在的位置。在这里使用临时变量。 正如其他人所说。希望使用malloc创建字符串,而不是数组。
并且str[new_len] = '\0';
超出范围。