高效的内存分配和释放问题

Efficient Memory allocation and freeing question

我正在编写一个程序,打印一个已被删除的字符串白色 space。

此时,在removeWhiteSpace函数中,我想知道内存分配和释放是否被有效地使用。

如果没有,您能否提出适当的改进建议:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *removeWhiteSpace();

int main()
{
    char *inputString = malloc(sizeof(char) * 100);
    
    scanf(" %[^\n]s", inputString);
    
    removeWhiteSpace(inputString);
    
    printf("%s\n", inputString);
    
    free(inputString);
    
    return 0;
}

char *removeWhiteSpace(char *inputString)
{
    char *tempArray = malloc(sizeof(char) * 100);
    char *tempPointer = strtok(inputString, " ");
    
    while (tempPointer != NULL)
    {
        strcat(tempArray, tempPointer);
        tempPointer = strtok(NULL, " ");
    }
    
    strcpy(inputString, tempArray);
    
    free(tempArray);
    
    return tempArray;
}

动态分配需要一些成本。动态分配如此小的固定大小数组看起来效率不高。 removeWhiteSpace 的 return 值也没有意义,因为它指的是已经释放的缓冲区。

简单地静态分配数组并且 removeWhiteSpace return 什么都没有。

另请注意:

  • 您应该声明函数的参数以避免错误。
  • 你必须在使用 strcat 之前初始化数组 tempArray。使用初始化器效率不高,因为它会初始化所有元素,而 strcat().
  • 只需要初始化第一个元素
  • 您应该通过 scanf() 限制读取的最大长度以避免缓冲区溢出。
  • 您不需要 scanf() 格式的 s,因为输入是由 [ 指定的,之后没有 scanf()s 告诉 scanf() 在字符串后使用 s

试试这个:

#include <stdio.h>
#include <string.h>

void removeWhiteSpace(char*);

int main()
{
    char inputString[100];
    
    scanf(" %99[^\n]", inputString);
    
    removeWhiteSpace(inputString);
    
    printf("%s\n", inputString);
    
    return 0;
}

void removeWhiteSpace(char *inputString)
{
    char tempArray[100];
    char *tempPointer = strtok(inputString, " ");
    tempArray[0] = '[=10=]';
    
    while (tempPointer != NULL)
    {
        strcat(tempArray, tempPointer);
        tempPointer = strtok(NULL, " ");
    }
    
    strcpy(inputString, tempArray);
}

我会做一个tortoise and hare算法。 只复制不是 space.

的字符
char *removeWhiteSpace(char *inputString) {
    char *in = inputString;
    char *out = inputString;

    // small optimization - do not copy to itself
    while (*in != '[=10=]' && *in != ' ') {
       in++;
       out++;
    }

    for (; *in != '[=10=]'; in++) {
       if (*in != ' ') {
            *out++ = *in;
       }
    }
    *out = '[=10=]';
    return inputString;
}