我已声明缓冲区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的事件?
答案 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
不会阻止您更改指针本身。
重新分配大小应该称为重新分配内存,您可以使用malloc
,calloc
或其他人之一来执行此操作。或者因为你用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应该不那么麻烦。