使用memset()为const char *分配新大小

时间:2013-08-24 07:42:48

标签: c++ c

我已声明缓冲区const char* buf;

稍后我想使用memset重新分配大小

buffer_len = 1024;
    memset(buf, '\0', buffer_len);
    buf[strlen(buf)-1]='\0';

给出错误:

client.cpp:73:30: error: invalid conversion from ‘const void*’ to ‘void*’ [-fpermissive]
In file included from client.cpp:2:0:
/usr/include/string.h:62:14: error:   initializing argument 1 of ‘void* memset(void*, int, size_t)’ [-fpermissive]
client.cpp:75:21: error: assignment of read-only location ‘*(buf + (((sizetype)strlen(buf)) + -1u))’

我知道这是由const引起的,但有没有替代方法或方法来执行它是const的事件?

4 个答案:

答案 0 :(得分:5)

赋值buf[strlen(buf)-1]='\0';无效,因为您将buf定义为const:const char* buf;读取编译器的错误消息:error: assignment of read-only location


有一点:你用buf设置\0,因此buf的长度为0(零索引为\0),如果假设buf声明为const即使那样你也会指责负面索引因为strlen(buf) - 1 == 0 - 1 = -1 - 未定义的行为

答案 1 :(得分:2)

memset未分配大小。它用字节填充缓冲区。填充声明为const char*的缓冲区是没有意义的,因为你声明它为const的原因是你自己不写入它。

您可以创建一个不同的数组,因为此const不会阻止您更改指针本身。

重新分配大小应该称为重新分配内存,您可以使用malloccalloc或其他人之一来执行此操作。或者因为你用c ++标记了这个,所以使用new运算符可能是最好的主意。

答案 2 :(得分:0)

很明显,作者要求解决他想要操作的问题。简单地解释复合误差是令人满意的。我不想解释为什么作者的代码没有编译,因为上面的答案很好地解释了这一点。

如果作者真的想要完成他在代码中所做的所有操作,我试着给出一个解决方案,尽管我不建议在现实世界的软件项目中这样做。

使用const_cast删除变量的const属性:

const char* buf;
...
buffer_len = 1024;
...
char *ptr = const_cast<char *>(buf);
memset(ptr, '\0', buffer_len);
ptr[strlen(buf)-1]='\0';

答案 3 :(得分:0)

在C中实现灵活字符串的一种方法是使用realloc

//Get some malloc'ed strings.
char* myString = asprintf("my cool, malloc()-allocated string\n");
char* myOtherString = asprintf("Oh, and by the way: Hello World!\n");

//Make room in myString to append the other string.
size_t finalStringSize = strlen(myString) + strlen(myOtherString);
myString = realloc(myString, finalStringSize + 1);   //+1 for termination

//Concatenate the strings
strcat(myString, myOtherString);
free(myOtherString), myOtherString = NULL;

但是,当然,使用C ++ std :: strings应该不那么麻烦。