簡體   English   中英

動態內存分配+截斷字符串問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM