2013-08-24 37 views
0

我必須聲明緩衝const char* buf;分配新的大小爲const char *用memset()

後來我想用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但沒有任何替代方案,或者是常量執行它的事件呢?

+4

你爲什麼要使用常量,如果你想改變緩衝? –

+2

如果你寫的代碼,我建議試圖要擺脫'的char *'和舊的C風格prtogtamming離開反正。改用'std :: string'。 – olevegard

+0

是代碼C還是C++? –

回答

0

明顯筆者詢問他想要什麼操作的解決方案。而簡單的解釋錯誤是令人滿意的。我不想解釋爲什麼作者的代碼沒有編譯,導致上面的答案很好地解釋了這一點。

如果作者真的想要在代碼中執行所有操作,我嘗試給出一個解決方案,但我不建議在現實世界的軟件項目中這樣做。但

//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:

使用const_cast刪除變量的常量屬性:

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

-1:這沒有解決OP的問題一位。查看其他答案。 – cmaster

+0

@cmaster不知道你在說什麼。如果你認爲你理解了這個問題,你可以指出代碼有什麼問題。我需要你的細節。 – lulyon

+0

問題是我們可以99%確定他的緩衝區從未被分配到包含1024個字節。 – cmaster

5

作業buf[strlen(buf)-1]='\0';無效,因爲您將buf定義爲const:const char* buf;讀取編譯器的錯誤消息:error: assignment of read-only location


一點:您可以設置buf與NUL \0所以BUF的長度爲0\0在零指數),那麼如果假設聲明buf爲const即使如此,你將在被assiging負數,因爲strlen(buf) - 1 == 0 - 1 = -1 - 未定義的行爲

+0

@ user814064 yes我在第二部分添加了。 –

+0

對於OP:我認爲之前/最好回答讀取編譯器消息。 –

+1

+1並祝賀您的​​「金牌C徽章」先生ASCII男士:P –

2

memset不分配大小。它用字節填充緩衝區。灌裝聲明爲const char*緩衝是沒有意義的,因爲你的原因聲明爲const是自己不寫它。

您可以創建一個不同的陣列,而不是,因爲這const不會阻止您更改指針本身。

重新分配大小應該稱爲重新分配內存,您可以使用malloc,calloc或其他人之一來執行此操作。或者,因爲你用C++標記了這個,所以使用new運算符可能是最好的主意。

+0

既然你提到'malloc'和'calloc',你應該也可以提及'realloc',這與我所想的OP最接近。 – cmaster

+0

哦,當然。當然有意義;) –

0

的方式來實現靈活的字符串C是使用realloc ::字符串應該不麻煩。

+0

作者是否有任何單一的暗示沒有分配內存?這甚至與他所要求的無關。 – lulyon

+0

@lulyon是的,有:「我想重新分配大小使用memset」我的例子顯示使用'realloc()'來實現這一點。 – cmaster

+0

「重新分配大小」並不意味着重新分配內存。大小變量'buffer_len'獨立於實際分配的內存。 – lulyon