0

我已经声明缓冲区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

4 回答 4

5

赋值buf[strlen(buf)-1]='\0'; 无效,因为您定义buf为 const: const char* buf;Read compiler's error message: error: assignment of read-only location


一点:你buf用 nul设置\0所以 buf 的长度是0\0在零索引处)然后如果假设声明buf为 const 即使那么你会在负索引处进行赋值,因为strlen(buf) - 1 == 0 - 1= -1– 未定义的行为

于 2013-08-24T07:45:12.480 回答
2

memset不指定大小。它用字节填充缓冲区。填充声明为的缓冲区const char*是没有意义的,因为您将其声明为 const 的原因是您自己不要写入它。

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

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

于 2013-08-24T07:45:28.613 回答
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 应该不那么麻烦。

于 2013-08-24T08:04:59.817 回答
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';
于 2013-08-24T07:51:45.877 回答