gpt4 book ai didi

c++ - 使用 realloc() 使 memmove() 安全

转载 作者:行者123 更新时间:2023-11-30 19:12:40 24 4
gpt4 key购买 nike

在我的函数中替换子字符串。如果输入子字符串比原始子字符串长,则将部分输入字符串移出以为输入子字符串腾出空间。

我知道这会导致未定义的行为。我认为我应该能够使用 realloc() 分配所需的空间,但没有成功。

我尝试在 memmove() 之前添加此内容:

char *newspc = (char*)realloc(in,len+sublen);
in = newspc;

这是一个合理的策略吗?为该操作腾出空间的正确方法是什么?

这是不使用 realloc() 的程序:

#include <iostream>
#include <string>
#include <string.h>

void replc(char* in, char* subin);

int main()
{
char stmt[] = "replacing this $string ok";
std::cout << stmt << "\n";
replc(stmt, "longerstring"); //<<<4 characters longer breaks the program
std::cout << stmt << "\n";

}

void replc(char* in, char* subin){
uint8_t len = strlen(in);
uint8_t aftok = strchr(strchr(in, '$'), ' ')-in;
uint8_t dollar = strchr(in, '$')-in;
uint8_t tklen = aftok - dollar;
uint8_t sublen = strlen(subin);

if(sublen <= tklen){
//enough room for substring
memmove(in+aftok-(tklen-sublen), in+aftok, (tklen-sublen)+1);
memcpy(in+dollar, subin, sublen);
in[len-(tklen-sublen)] = '\0';
}
else{
//not enough room for substring
// memory allocation should take place here?
memmove(in+aftok+(sublen-tklen), in+aftok, (sublen-tklen)+1);
memcpy(in+dollar, subin, sublen);
in[len+(sublen-tklen)] = '\0';
}

}

最佳答案

首先,如果您想使用 realloc,则不必使用 memmove,因为 realloc 会负责复制数据。

来自人:

The realloc() function changes the size of the memory block pointed to by ptr to size bytes. The contents will be unchanged in the range from the start of the region up to the minimum of the old and new sizes.

此外,您只能对以前由 malloc、realloc 或 calloc 返回的指针使用 realloc

Unless ptr is NULL, it must have been returned by an earlier call to malloc(), calloc() or realloc().

所以你需要在你的main中使用malloc

char *stmt = malloc(strlen("replacing this $string ok") + 1);
if (stmt)
stmt = "replacing this $string ok";

其次,如果要更改调用函数中指针的值,则需要在该指针上使用指针(C 风格)或引用(C++ 风格),否则调用函数中的指针将指向旧地址。

原型(prototype)的 C 风格示例:

void replc(char** in, char* subin);

分配(NewSize 作为整数):

*in = realloc(*in, NewSize);

(请记住,如果分配失败,malloc 和 realloc 可能会返回 NULL)

关于c++ - 使用 realloc() 使 memmove() 安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36673713/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com