[英]Dynamic memory allocation + truncating a string issue
我一直在鬼混malloc,realloc和free,以便編寫一些基本函數來對C字符串(char *)進行操作。 從字符串中刪除最后一個字符時,我遇到了這個奇怪的問題。 我用這樣的原型編寫了一個函數:
int string_erase_end (char ** dst, size_t size);
應該將“ dst”字符串縮短一個字符。 到目前為止,我已經提出了以下代碼:
int string_erase_end (char ** dst, size_t size)
{
size_t s = strlen(*dst) - size;
char * tmp = NULL;
if (s < 0) return (-1);
if (size == 0) return 0;
tmp = (char*)malloc(s);
if (tmp == NULL) return (-1);
strncpy(tmp,*dst,s);
free(*dst);
*dst = (char*)malloc(s+1);
if (*dst == NULL) return (-1);
strncpy(*dst,tmp,s);
*dst[s] = '\0';
free(tmp);
return 0;
}
在main()中,當我截斷字符串時(是的,我之前在它們上調用了malloc),我得到了奇怪的結果。 根據我要截斷的字符數,它可以正常工作,截斷錯誤的字符數或引發分段錯誤。
我沒有動態內存分配的經驗,並且一直使用C ++及其std :: string來完成所有此類骯臟的工作,但是這次我需要在C中進行這項工作。如果有人幫助我找到並糾正了我的問題,我將不勝感激。這里的錯誤。 提前致謝。
根據您的描述,您的函數應該擦除字符串中的最后n個字符:
/* Assumes passed string is zero terminated... */
void string_erase_last_char(char * src, int num_chars_to_erase)
{
size_t len = strlen(src);
if (num_chars_to_erase > len)
{
num_chars_to_erase = len;
}
src[len - num_chars_to_erase] = '\0';
}
第一個strncpy()不會在tmp的末尾添加“ \\ 0”。
同樣,您可以避免重復副本:* dst = tmp;
我不明白size
參數的用途。
如果最初使用malloc()
分配了字符串,則應僅使用realloc()
更改其大小。 這將自動保留內容,並且需要較少的操作:
int string_erase_end (char ** dst)
{
size_t len;
char *ns;
if (dst == NULL || *dst == NULL)
return -1;
len = strlen(*dst);
if (len == 0)
return -1;
ns = realloc(*dst, len - 1);
if (ns == NULL)
return -1;
ns[len - 1] = '\0';
*dst = ns;
return 0;
}
在“現實世界”中,通常不會更改1個字符的截斷的分配大小; 它太低效了。 相反,您應該分別跟蹤字符串的長度和分配的大小。 這使得字符串很容易增長。 只要已經分配了空間,追加字符就非常快。
同樣,在C語言中,您無需malloc()
的返回值; 它沒有任何用途,並且可以隱藏錯誤,所以不要這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.